[알고리즘] 파이썬으로 날짜와 시간 다루기

송현준·2024년 6월 30일

알고리즘

목록 보기
4/4

😄 개요

날짜를 입력으로 주고 해당 날짜를 이용해 연산을 요구하는 문제들이 종종 있습니다.
저는 최근에 이 문제 (solved.ac 2022)에서 만났는데요, 이 문제를 해결하며 공부했던 파이썬의 datetime 모듈에 대해 필요한 부분들만 정리해보았습니다.


📜 코드

모듈

파이썬에서는 날짜와 시간을 자유롭게 다룰 수 있도록 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")

첫 번째 인자로는 파싱할 문자열을, 두 번째 인자로 해당 문자열의 형식을 넣어주면 됩니다.
문자열 형식의 형식 지정자 외에 공백이나, -, : 등의 기호등을 모두 맞춰줘야 하는건 물론입니다.
형식지정자는 다음과 같습니다.

형식지정자의미예시
%Y4자리 년도1999, 2024
%m0을 채운 월04, 12
%d0을 채운 일05, 18
%H24시간제 시간08, 23
%M0을 채운 분06, 34
%S0을 채운 초07, 58

그 외에도 요일, 오전오후 등을 나타내는 형식지정자도 있습니다.
더 많은 형식 지정자

날짜 간 연산하기1 - 날짜를 UNIX시간으로 다루기

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 시간으로의 변환이 필요합니다.


여기서 UNIX 시간은 시간을 1970년 1월 1일부터 몇초가 흘렀는지로 변환한 시간입니다. 이렇게 변환하면 시간이 초 단위로 통일되어 연산하기 쉬워지죠.

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초 만큼 차이가 난다는 것을 알 수 있습니다.

날짜 간 연산하기2 - timedelta 객체 사용하기

위의 방식은 날짜와 날짜사이가 얼마나 차이나는지는 쉽게 알 수 있지만,
특정 날짜에 며칠, 혹은 몇시간 뒤는 얼마인지는 연산하기 복잡합니다.


물론 datetime.datetime 의 fromtimestamp() 메서드를 활용하면 UNIX 시간을 datetime.datetime 객체로 변환해주어 가능합니다.


지금의 79시간 뒤의 날짜는 언제인지 구하는 예제를 들어보겠습니다.
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 클래스를 활용해 해결할 수 있습니다.

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 모듈에 대해 아주 간단하게 정리해봤는데요, 이 모듈 하나만 있으면 알고리즘 문제들에 나오는 시간 관련된 부분들은 잘 처리할 수 있는 듯 합니다.

0개의 댓글