본문 바로가기

Programming

[Python] 파이썬 날짜 계산 (이번달, 지난달, 첫일, 말일, 요일) datetime

api 등을 통해서 각종 데이터를 조회하다 보면 조회 기간 같이 거의 항상 포함되는 값들이 있습니다.
마침 파이썬으로 데이터를 조회 및 활용하기 위해 찾아보던 중, 많이 사용되고 있는 dateutil의 relativedelt 라는 유틸이 날짜 대비 상대적이고 꽤 직관적으로 구할 수 있는 것 같아 사용하면서 기록해봅니다.

import

from datetime import datetime
from dateutil.relativedelta import *

먼저 아래의 날짜 계산을 위해선 위처럼 코드상에 import가 필요합니다. 

이번달 첫일

today = datetime.today()
print(today)

this_month_first = datetime(today.year, today.month, 1)
print('이번달 첫일: ' + this_month_first.strftime('%Y-%m-%d %H:%M:%S'))

>> 2021-10-13 20:47:12.524685
>> 이번달 첫일: 2021-10-01 00:00:00

이번달 말일

today = datetime.today()
print(today)

next_month = datetime(today.year, today.month, 1) + relativedelta(months=1)
print(next_month)

this_month_last = next_month + relativedelta(seconds=-1)
print('이번달 말일: ' + this_month_last.strftime('%Y-%m-%d %H:%M:%S'))

>> 2021-10-13 20:48:14.709260
>> 2021-11-01 00:00:00
>> 이번달 말일: 2021-10-31 23:59:59

지난달 첫일

today = datetime.today()
print(today)

last_month_first = datetime(today.year, today.month, 1) + relativedelta(months=-1)
print('지난달 첫일: ' + last_month_first.strftime('%Y-%m-%d %H:%M:%S'))

>> 2021-10-13 20:49:36.854544
>> 지난달 첫일: 2021-09-01 00:00:00

지난달 말일

today = datetime.today()
print(today)

last_month_last = datetime(today.year, today.month, 1) + relativedelta(seconds=-1)
print('지난달 말일: ' + last_month_last.strftime('%Y-%m-%d %H:%M:%S'))

>> 2021-10-13 20:50:54.939671
>> 지난달 말일: 2021-09-30 23:59:59

다음달 첫일

today = datetime.today()
print(today)

next_month_first = datetime(today.year, today.month, 1) + relativedelta(months=1)
print('다음달 첫일: ' + next_month_first.strftime('%Y-%m-%d %H:%M:%S'))

>> 2021-10-13 20:36:59.938626
>> 다음달 첫일: 2021-11-01 00:00:00

다음달 말일

today = datetime.today()
print(today)

next_month_first = datetime(today.year, today.month, 1) + relativedelta(months=2)
print(next_month_first)

next_month_last = next_month_first + relativedelta(seconds=-1)
print('다음달 말일: ' + next_month_last.strftime('%Y-%m-%d %H:%M:%S'))

>> 2021-10-13 20:52:32.996723
>> 2021-12-01 00:00:00
>> 다음달 말일: 2021-11-30 23:59:59

3일 전

today = datetime.today()
print(today)

three_days_ago = datetime(today.year, today.month, today.day) + relativedelta(days=-3)
print('3일 전: ' + three_days_ago.strftime('%Y-%m-%d'))

>> 2021-10-13 20:53:20.056534
>> 3일 전: 2021-10-10
relativedelta의 매개변수 days에 플러스, 마이너스 숫자만 바꾸면 다른 일자도 쉽게 구할 수 있습니다.

1개월 전

today = datetime.today()
print(today)

a_month_ago = datetime(today.year, today.month, today.day) + relativedelta(months=-1)
print('1개월 전: ' + a_month_ago.strftime('%Y-%m-%d'))

>> 2021-10-13 20:54:54.068352
>> 1개월 전: 2021-09-13
이 역시도 months 값을 통해서 1개월뿐만 아니라 3개월, 6개월 등등 유용합니다.

다음 월요일

today = datetime(2021, 10, 13) #수요일
monday = today + relativedelta(weekday=MO(1))
print('다음 월요일: ' + monday.strftime('%Y-%m-%d'))

today = datetime(2021, 10, 11) #월요일
monday = today + relativedelta(weekday=MO(1))
print('다음 월요일: ' + monday.strftime('%Y-%m-%d'))

>> 다음 월요일: 2021-10-18
>> 다음 월요일: 2021-10-11
ㄴ 요일이 동일하면 변동이 없습니다.
(today의 날짜가 월요일 => 그대로 동일한 날짜의 월요일)
(weekday의 MO(=0)는 월요일을 의미합니다. MO, TU, etc) 

이전 월요일

today = datetime(2021, 10, 13) #수요일
monday = today + relativedelta(weekday=MO(-1))
print('이전 월요일 : ' + monday.strftime('%Y-%m-%d'))

today = datetime(2021, 10, 11) #월요일
monday = today + relativedelta(weekday=MO(-1))
print('이전 월요일 : ' + monday.strftime('%Y-%m-%d'))

>> 이전 월요일 : 2021-10-11
>> 이전 월요일 : 2021-10-11
ㄴ 위와 같이 요일이 동일하면 변동이 없습니다.

위처럼 dateutil의 relativedelta을 사용해보니 상당히 간단하고 직관적으로 일자들을 구할 수 있었습니다.
relativedelta의 매개변수로 위에서 사용한 seconds, days, months 말고도 years, weeks, hours, minutes,
microseconds 등 상대적 값으로 이용할 수 있는 항목이 다양하게 있습니다.

반응형