📚 서론
얼마전에 경험삼아 봤던 코딩테스트에서 날짜차이를 이용해서 계산하는 문제가 나왔는데,
매달 일수가 다른 걸 하나하나 고려해야 된다는 점에서 꽤나 애를 먹었었다.
심지어 어렸을 때부터 날짜계산이랑 숫자차이에 유독 취약했던 나는 결국 계산이 꼬이고 꼬여 멘붕이 와버렸는데...
그때 손가락에 불나게 구글링 하다가 알게된 datetime....이 좋은 걸 냅두고 나처럼 바보짓 하는 사람이 없길 바라서 글을 쓰게 되었다... 날짜 차이 계산하는 게 생각보다 자주 나오는 것 같으니 이 기회에 잘 알아두기!
📚 문제 유형
가장 간단하게는
o월 o일이 월요일일 때, 사용자에게 날짜를 입력 받고 무슨 요일인지 출력하라
같은 문제를 풀 때 유용하다.
📚 datetime 패키지
datetime 패키지에는 여러가지 클래스들이 있다.
임포트 방법은 다음과 같다.
import datetime as dt
📚 datetime 클래스
datetime 클래스에서는 현재 시각을 출력하는 now() 메서드를 제공한다.
x = dt.datetime.now()
print(x)
현재 시간 출력
now 클래스 메서드는 컴퓨터의 현재 시각을 datetime 클래스 객체로 만들어 반환한다.
datetime 클래스 객체는 다음과 같은 속성을 가진다.
- year : 연도
- month : 월
- day : 일
- hour : 시
- minute : 분
- second : 초
- microsecond: 마이크로초(micro seconds, 백만분의 일초)
예를 들어 현재 시간 중에 분만 알고싶다 하면 이렇게 불러올 수 있는 것이다.
x.minute
다음과 같은 메서드도 제공한다.
- weekday : 요일 반환(0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일)
- strftime : 문자열 반환
- date : 날짜 정보만 가지는 date 클래스 객체 반환
- time : 시간 정보만 가지는 time 클래스 객체 반환
이 중 유용한 strfttime 메서드는 어떤 형식으로 문자열을 만들지 결정하는 형식 문자열을 인수로 받는다.
형식 문자열은 날짜 및 시간 지정 문자열을 포함한다.
다음은 많이 사용되는 날짜 및 시간 지정 문자열이다.
예를 들어 위에서 저장한 변수 x의 시간 정보는 다음처럼 문자열로 바꿀 수 있다.
print(x.strftime("%H시 %M분 %S초"))
00시 08분 06초
반대로 문자열로부터 날짜와 시간 정보를 읽어서 datetime 클래스 객체를 만들 수도 있다.
이 때는 strptime 클래스 메서드를 사용한다.
strptime(날짜와 시간 정보를 가진 문자열, 그 문자열을 해독할 수 있는 형식 문자열)
dt.datetime.strptime("2022-09-02 00:01", "%Y-%m-%d %H:%M")
📚 날짜/시간차 구하기
날짜, 시간차를 구할 때는 두 개의 datetime 클래스 객체의 차이를 구한다.
이 결과는 timedelta 클래스 객체로 반환되는데,
앞서 살펴봤듯 timedelta는 시간 구간 정보를 저장하는 클래스이다.
dt1 = dt.datetime(2022, 9, 2, 14, 20) # 2022년 9월 2일 14시 20분
dt2 = dt.datetime(2022, 1, 1, 00, 00) # 2022년 1월 1일 00시 00분
td = dt1 - dt2 # 두 시간 차이
print(td)
244 days, 14:20:00
위와 같이 며칠 몇시간이 지났는지 알 수 있다.
td.days #일수차이
td.seconds #초차이
td.total_seconds() #모든 속성을 초단위로 모아서 반환
🚩 응용 문제 풀이 - 백준 1924번
위의 문제를 날짜 차이를 이용해 풀어보자.
그냥 요일 알려달라 해버리면 뚝딱 끝나겠지만 그러면 연습이 안 될 것 같아서 날짜 차이를 이용해보았다.
7로 나누었을 때 나머지가 0이면 월요일, 1이면 화요일, ... , 6이면 일요일인 점을 이용했다.
from datetime import datetime
# 사용자에게 월과 일이 공백으로 구분된 문자열을 입력 받는다.
user_input = input()
# 1월 1일 월요일을 기준으로 두 날짜의 일수 차이를 구한다.
dt1 = datetime.strptime("1 1", "%m %d")
dt2 = datetime.strptime(user_input, "%m %d")
td = (dt2 - dt1).days
# 요일 리스트
# td를 7로 나눈 나머지를 구한다.
# 나머지가 0이면 MON, 1이면 TUE, ..., 6이면 SUN 출력하도록 구현
l = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
print(l[td%7])
💡 Reference
2.15 파이썬에서 날짜와 시간 다루기 — 데이터 사이언스 스쿨
.ipynb .pdf to have style consistency -->
datascienceschool.net
https://docs.python.org/3/library/datetime.html
datetime — Basic date and time types — Python 3.10.6 documentation
datetime — Basic date and time types Source code: Lib/datetime.py The datetime module supplies classes for manipulating dates and times. While date and time arithmetic is supported, the focus of the implementation is on efficient attribute extraction for
docs.python.org