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 등 상대적 값으로 이용할 수 있는 항목이 다양하게 있습니다.
'Programming' 카테고리의 다른 글
php 설치 방법 (window, Visual Studio Code) (0) | 2021.11.23 |
---|---|
키움증권 api (Open API+) 사용 방법 (KOA Studio 살펴보기) (0) | 2021.11.21 |
키움증권 api (Open API+) 사용 방법 (Open API 접속) (0) | 2021.11.21 |
키움증권 api (Open API+) 사용 방법 (서비스 신청 및 설치) (0) | 2021.11.21 |
[Java] Open JDK 설치 및 설정 (window) (0) | 2021.11.21 |
[ PostgreSQL ] 테이블 데이터 삭제 (TRUNCATE TABLE, DELETE) (transaction test) (0) | 2021.10.14 |