Summary

  • while 루프에 timedelta/relativedelta를 더해 기간별 날짜 문자열 리스트를 만든다
  • dt.day_name()은 요일 문자열을, dt.dayofweek는 요일 정수(월=0)를 반환한다
  • 요일 정수를 5로 나눈 몫으로 평일·주말을 구분한다

기간별 날짜 문자열 생성

시작일부터 끝일까지 일별 또는 월별로 YYYYMMDD(또는 YYYYMM) 문자열 리스트를 생성한다. 일별은 timedelta(days=1), 월별은 relativedelta(months=1)을 더한다.

from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
 
start_date = datetime(2023, 2, 21)
end_date = datetime(2024, 2, 20)
 
date_list = []
current_date = start_date
 
# 일별
while current_date <= end_date:
    date_list.append(current_date.strftime('%Y%m%d'))
    current_date += timedelta(days=1)
 
# 월별 (current_date를 다시 start_date로 초기화 후)
while current_date <= end_date:
    date_list.append(current_date.strftime('%Y%m'))
    current_date += relativedelta(months=1)

요일 추출

요일 문자열

dt.day_name()Monday, Sunday 같은 요일 이름을 반환한다.

import pandas as pd
 
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df['weekday'] = df['date'].dt.day_name()

요일 정수

dt.dayofweek(또는 dt.weekday)는 월요일을 0, 일요일을 6으로 반환한다.

df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df['weekday'] = df['date'].dt.dayofweek

평일 / 주말 구분

요일 정수를 5로 나눈 몫이 1이면 주말(토=5, 일=6)이다.

df['weekday'] = df['date'].apply(lambda x: '주말' if x.weekday() // 5 == 1 else '평일')

월 시작일·끝일 구하기

날짜를 입력받아 그 달의 첫날과 끝날을 구한다. 끝날은 다음 달 1일에서 하루를 뺀다.

from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
 
def get_first_day(date):
    first_day = datetime(year=date.year, month=date.month, day=1).date()
    return first_day.strftime('%Y%m%d')
 
def get_last_day(date):
    first_day = datetime(year=date.year, month=date.month, day=1).date()
    last_day = first_day + relativedelta(months=1) - timedelta(days=1)
    return last_day.strftime('%Y%m%d')

Reference