날짜를 입력으로 주고 해당 날짜를 이용해 연산을 요구하는 문제들이 종종 있습니다.
저는 최근에 이 문제 (solved.ac 2022)에서 만났는데요, 이 문제를 해결하며 공부했던 파이썬의 datetime 모듈에 대해 필요한 부분들만 정리해보았습니다.
파이썬에서는 날짜와 시간을 자유롭게 다룰 수 있도록 datetime 모듈을 제공합니다.
datetime 모듈만 있으면 웬만한 파싱과 연산은 처리할 수 있습니다.
datetime 클래스
datetime 내에서도 날짜와 시간을 다루기 위해 전용 클래스를 하나 두고 있습니다.
모듈과 이름이 동일해서 헷갈릴 수 있으니 주의해야합니다.
timedelta 클래스
클래스 이름 그대로 시간의 변화를 나타냅니다. datetime에서 시간을 더하고 빼는 연산을 지원하기 위해 존재합니다.
datetime.datetime 클래스에 직접 년, 월, 일 등을 넣어 초기화할 수 있지만,
문자열을 바로 파싱해서도 초기화 할 수 있습니다.
다음과 같은 문자열을 datetime.datetime 객체로 만든다고 가정해봅시다.
dateString = "2024-06-30 18:01:52"
datetime.datetime 객체의 strptime 메서드를 사용하면 초기화할 수 있습니다.
dateString = "2024-06-30 18:01:52"
import datetime
date = datetime.datetime.strptime(dateString, "%Y-%m-%d %H:%M:%S")
첫 번째 인자로는 파싱할 문자열을, 두 번째 인자로 해당 문자열의 형식을 넣어주면 됩니다.
문자열 형식의 형식 지정자 외에 공백이나, -, : 등의 기호등을 모두 맞춰줘야 하는건 물론입니다.
형식지정자는 다음과 같습니다.
| 형식지정자 | 의미 | 예시 |
|---|---|---|
| %Y | 4자리 년도 | 1999, 2024 |
| %m | 0을 채운 월 | 04, 12 |
| %d | 0을 채운 일 | 05, 18 |
| %H | 24시간제 시간 | 08, 23 |
| %M | 0을 채운 분 | 06, 34 |
| %S | 0을 채운 초 | 07, 58 |
그 외에도 요일, 오전오후 등을 나타내는 형식지정자도 있습니다.
더 많은 형식 지정자
datetime.datetime 객체끼리는 직접적인 연산을 할 수 없습니다.
예를 들어, 다음의 두 datetime.datetime 객체의 차이를 구하고 싶다고 가정해봅시다.
import datetime
date1 = datetime.datetime.strptime("2024-06-30 18:01:52", "%Y-%m-%d %H:%M:%S")
date2 = datetime.datetime.strptime("2024-06-28 15:32:34", "%Y-%m-%d %H:%M:%S")
무작정 이런 식으로 빼면 datetime.datetime 끼리는 연산이 불가능하다고 오류가 발생합니다.
print(date1 - date2) # 오류
그래서 datetime.datetime끼리 연산하기 위해서는 UNIX 시간으로의 변환이 필요합니다.
datetime.datetime 객체의 timestamp 메서드를 활용하면 해당 datetime.datetime 객체가 unix 시간으로 얼마인지 알 수 있습니다.
import datetime
date1 = datetime.datetime.strptime("2024-06-30 18:01:52", "%Y-%m-%d %H:%M:%S")
date2 = datetime.datetime.strptime("2024-06-28 15:32:34", "%Y-%m-%d %H:%M:%S")
date1unix = date1.timestamp()
date2unix = date2.timestamp()
print(date1unix - date2unix)
이를 실행해보면 181758.0 을 얻을 수 있고, 이는 두 시간이 181758초 만큼 차이가 난다는 것을 알 수 있습니다.
위의 방식은 날짜와 날짜사이가 얼마나 차이나는지는 쉽게 알 수 있지만,
특정 날짜에 며칠, 혹은 몇시간 뒤는 얼마인지는 연산하기 복잡합니다.
물론 datetime.datetime 의 fromtimestamp() 메서드를 활용하면 UNIX 시간을 datetime.datetime 객체로 변환해주어 가능합니다.
import datetime
#현재 시간 받아오기
curTime = datetime.datetime.now()
#79시간 뒤의 unix 시간 구하기
nextTimeUnix = curTime.timestamp() + 79 * 60 * 60
#datetime으로 변환
nextTime = datetime.datetime.fromtimestamp(nextTimeUnix)
print(nextTime)
하지만 UNIX 시간으로 변환을 하고, 다시 datetime으로 변환하는 것이 뭔가 비효율적인 것 같죠.
datetime.timedelta 객체에는 weeks부터 seconds까지 날짜와 관련된 파라미터를 넣어 초기화할 수 있습니다.
이렇게 생성한 datetime.timedelta 객체는 datetime.datetime 객체에 더하거나 뺄 수 있습니다.
import datetime
#현재 시간 받아오기
curTime = datetime.datetime.now()
#79시간을 timedelta로 나타내기
timeDiff = datetime.timedelta(hours=79)
#79시간 뒤 구하기
nextTime = curTime + timeDiff
print(nextTime)
파이썬의 datetime 모듈에 대해 아주 간단하게 정리해봤는데요, 이 모듈 하나만 있으면 알고리즘 문제들에 나오는 시간 관련된 부분들은 잘 처리할 수 있는 듯 합니다.