Python의 datetime 모듈은 날짜와 시간을 처리하기 위한 기본 내장 모듈입니다.
시계열 데이터 전처리에 있어 핵심적인 역할을 하는데, 시계열 데이터 분석은 시간의 흐름에 따른 패턴을 찾는 과정이기 때문에, 날짜와 시간을 다루는 것은 필수적입니다.
datetime 모듈은 다음과 같은 주요 클래스를 제공합니다.
datetime.datetime:
날짜와 시간을 모두 포함하는 클래스입니다. 특정 날짜와 시간을 생성하고, 두 datetime 객체 간의 차이를 계산하거나, 날짜와 시간을 포맷팅하는데 사용됩니다.
datetime.date:
날짜만을 포함하는 클래스입니다. 연도, 월, 일 정보를 다루며, 날짜 간의 차이를 계산할 수 있습니다.
datetime.time:
시간만을 포함하는 클래스입니다. 시, 분, 초, 마이크로초 정보를 다룹니다.
datetime.timedelta:
두 datetime 객체 간의 차이를 나타내는 클래스입니다. 시간 간격을 계산하고, 날짜와 시간에 간격을 더하거나 뺄 수 있습니다.
문자열을 datetime 객체로 변환: 데이터셋에서 날짜와 시간이 문자열로 저장된 경우, 이를 datetime 객체로 변환하여 다양한 시간 연산을 수행할 수 있습니다.
시간 간격 계산: 두 사건 사이의 시간 간격을 계산하여 분석에 활용할 수 있습니다.
날짜/시간 정규화: 날짜와 시간을 표준 형식으로 변환하여 일관된 데이터 처리를 할 수 있습니다.
특정 시점 추출: 월말, 분기말 등의 특정 시점을 추출하여 분석할 수 있습니다.
시간 기반 특성 생성: 요일, 월, 분기 등의 시간 기반 특성을 생성하여 모델링에 활용할 수 있습니다.
적용
현재 날짜와 시간 가져오기
now = datetime.now()
time delta 클래스를 이용한 날짜 연산
future_date = now + timedelta(days=100)
timedelta 클래스는 기간을 표현하며, 날짜나 시간에 더하거나 빼는 연산에 사용됩니다. 예를 들어, 100일 후의 날짜를 계산하려면 timedelta(days = 100)를 현재 날짜에 더해주면 됩니다.
날짜만 추출
future_data_only = future_date.date()
경우에 따라 시간 부분을 제외하고 날짜만 필요할 수 있습니다. 이때는 datetime객체의 .date() 메서드를 사용하여 날짜 부분만 추출할 수 있습니다.
시간 차이 측정
from datetime import datetime, timedelta
# 현재 날짜와 시간
now = datetime.now()
# 100일 뒤의 날짜 계산
n_days = 100
future_date = now + timedelta(days = n_days)
# 두 날짜 사이의 차이 계산
time_diff = future_date - now
print(f"{n_days}일 뒤까지의 시간 차이: {time_diff}")
# 시간 단위로 변환
hours_diff = time_diff.total_seconds() / 3600
print(f"시간 차이 (시간 단위로): {hours_diff:.2f} 시간")
# 과거 날짜 계산 (예: 어제)
yesterday = now - timedelta(days = 1)
print(f"어제 날짜와 시간: {yesterday}")
- timedelta 객체를 사용하여 미래 날짜를 계산하려면, 현재 날짜에 timedelta(days=n_days)를 더해줍니다.
- 두 날짜의 차이를 계산할 때는 datetime 객체끼리의 뺄셈을 사용합니다. 이로 인해 또 다른 timedelta 객체가 생성됩니다.
- timedelta 객체의 전체 초(second)를 계산하려면 total_seconds() 메서드를 사용하고, 이를 시간 단위로 변환하려면 3600으로 나눕니다.
total_seconds(): 전체 시간을 초 단위로 반환
- 과거 날짜를 계산하려면 현재 날짜에서 timedelta(days=1)을 빼줍니다.
days: 일 단위 차이
seconds: 초 단위 차이(일 단위를 제외한 초)
microseconds: 마이크로초 단위 차이(초 단위를 제외한 마이크로초)
datetime의 date 클래스 생성과 날짜 비교
from datetime import date
# 오늘 날짜 가져오기
today = date.today()
print(f"오늘 날짜: {today}")
# 특정 날짜 설정
special_day = date(2024, 12, 25)
print(f"특별한 날: {special_day}")
# 날짜 비교
if today < special_day:
print("특별한 날이 아직 오지 않았습니다.")
elif today == special_day:
print("오늘은 특별한 날입니다!")
else:
print("특별한 날이 지났습니다.")
- date 클래스를 datetime 모듈에서 가져오려면 from datetime import date를 사용합니다.
- 오늘 날짜를 가져오기 위해 date.today() 메서드를 사용합니다.
- 특정 날짜를 설정할 때 date(연도, 월, 일) 형태로 작성합니다. 예를 들어, special_day = date(2024, 12, 25)와 같이 설정합니다.
datetime의 time 클래스 생성과 시간 비교
from datetime import datetime, time
# 현재 시간 가져오기
now = datetime.now()
current_time = now.time()
print(f"현재 시간: {current_time}")
# 특정 시간 설정
start_time = time(9, 0)
end_time = time(17, 0)
print(f"업무 시작 시간: {start_time}, 종료 시간: {end_time}")
# 시간 비교
if start_time <= current_time <= end_time:
print("현재는 업무 시간입니다.")
else:
print("현재는 업무 시간이 아닙니다.")
- time 클래스를 datetime 모듈에서 가져오기 위해 from datetime import time을 사용합니다.
- 현재 시간에서 시간 부분만 가져오기 위해 now.time() 메서드를 사용합니다.
- 특정 시간을 설정하려면 time(시, 분) 형태로 작성합니다. 예를 들어, start_time = time(9, 0)과 end_time = time(17, 0)를 설정합니다.
datetime의 date와 time 결합하여 datetime 생성
from datetime import datetime, date, time
# 특정 날짜와 시간 설정
meeting_date = date(2024, 1, 15)
meeting_time = time(14, 30)
# 날짜와 시간을 결합하여 datetime 객체 생성
meeting_datetime = datetime.combine(meeting_date, meeting_time)
print(f"회의 일시: {meeting_datetime}")
- datetime 객체를 생성하기 위해 datetime.combine() 메서드를 사용합니다. 이 메서드는 특정 날짜(date 객체)와 시간(time 객체)를 결합하여 datetime 객체를 만듭니다.
날짜 포맷팅: strftime을 활용한 날짜 및 시간 형식 지정
from datetime import datetime
# 현재 시간 얻기
now = datetime.now()
# 기본 포맷으로 출력 (예시: 2024-08-07 05:40:28)
basic_format = now.strftime('%Y-%m-%d %H:%M:%S')
print(f"기본 포맷: {basic_format}")
# 한글 포맷으로 출력 (예시: 2024년 08월 07일 05시 40분 28초)
korean_format = now.strftime('%Y년 %m월 %d일 %H시 %M분 %S초')
print(f"한글 포맷: {korean_format}")
# 날짜만 출력 (예시: 2024/08/07)
date_only_format = now.strftime('%Y/%m/%d')
print(f"날짜만: {date_only_format}")
# 12시간제 시간만 출력 (예시: 05:40 AM)
time_12h_format = now.strftime('%I:%M %p')
print(f"12시간제 시간만: {time_12h_format}")
# 요일과 월 이름 포함 포맷 (예시: Wednesday, 07 August 2024)
weekday_month_format = now.strftime('%A, %d %B %Y')
print(f"요일과 월 이름 포함 포맷: {weekday_month_format}")
# ISO 8601 표준 포맷 (예시: 2024-08-07T05:40:28)
iso_format_basic = now.strftime('%Y-%m-%dT%H:%M:%S')
print(f"ISO 8601 표준 포맷 (기본): {iso_format_basic}")
# ISO 8601 표준 포맷 (예시: 2024-08-07T05:40:28+0900)
# 시간대 포함
iso_format_with_timezone = now.strftime('%Y-%m-%dT%H:%M:%S%z')
print(f"ISO 8601 표준 포맷 (시간대 포함): {iso_format_with_timezone}")
strftime 메서드는 datetime 객체를 특정 형식의 문자열로 변환하는 강력한 도구입니다. 이 메서드를 사용하면 날짜와 시간을 다양한 형식으로 포맷팅할 수 있어, 보고서 작성, 데이터 시각화, 로그 기록 등에서 유용하게 활용할 수 있습니다.
주요 포맷 코드
- %Y: 4자리 연도
- %m: 2자리 월
- %d: 2자리 일
- %H: 2자리 24시간제 시간(00-23)
- %l: 2자리 12시간제 시간(01-12)
- %M: 2자리 분(00-59)
- %S: 2자리 초(00-59)
- %p: AM/PM 표시
- %A: 요일 (예: Wednesday)
- %B: 월 이름 (예: August)
- %Y-%m-%d: ISO 8601 표준 날짜 형식
- %d %B %Y: 일 - 월이름 - 연도 형식(예: 07 August 2024)