[python] 날짜&시간 연산 (datetime, timedelta, strptime, strftime)
datetime
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
from datetime import datetime
dt = datetime(2025, 10, 15, 21)
print(dt) # 2025-10-15 21:00:00
print(dt.microsecond) # 0
* 밀리초(milliseconds)가 아닌 마이크로초(microseconds) 인자 필요. ( ex) 123ms = 123,000µs )
* tzinfo 인자가 없다면(None)이라면 naive datetime, 아래처럼 타임존을 지정하면 aware datetime
from datetime import datetime, timezone
from zoneinfo import ZoneInfo # Python 3.9+
naive = datetime(2018, 7, 13, 21) # naive (tzinfo=None)
aware_utc = datetime(2018, 7, 13, 21, tzinfo=timezone.utc) # UTC 기준
aware_seoul = datetime(2018, 7, 13, 21, tzinfo=ZoneInfo("Asia/Seoul")) # KST(+09:00)
naive datetime vs aware datetime
- naive ↔ naive: 비교/뺄셈 가능 (타임존 없이 단순 값 비교)
- aware ↔ aware: 비교/뺄셈 가능 (서로 다른 타임존이여도 내부적으로 UTC로 정규화)
- naive ↔ aware: 비교/뺄셈 시 TypeError
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
naive1 = datetime(2018, 7, 13, 21)
naive2 = datetime(2018, 7, 13, 20)
aware_utc = datetime(2018, 7, 13, 21, tzinfo=timezone.utc)
aware_seoul = datetime(2018, 7, 13, 21, tzinfo=ZoneInfo("Asia/Seoul"))
# 타입 확인
type(naive1) # <class 'datetime.datetime'>
type(aware_utc) # <class 'datetime.datetime'>
# naive연산 (결과 데이터 타입은 timedelta)
naive1 - naive2 # datetime.timedelta(hours=1)
# aware연산 (서로 다른 타임존)
aware_seoul - aware_utc
# naive와 aware 연산
# naive1 - aware_utc -> TypeError
datetime.combine()
날짜객체(date) & 시간객체(time) 통합.
from datetime import date, time, datetime
d = date(2025, 10, 15) # 연-월-일
t = time(9, 30, 45, 123456) # 시:분:초.마이크로초
dt = datetime.combine(d, t) # 2025-10-15 09:30:45.123456
개별 날짜/시간 통합
a = datetime(2025, 10, 15, 9, 0, 0) # 날짜 추출용
b = datetime(2020, 1, 1, 18, 45, 0) # 시간 추출용
merged = datetime.combine(a.date(), b.time()) # 2025-10-15 18:45:00
timedelta
from datetime import timedelta
td = timedelta(days=2, hours=3, minutes=15)
print(td) # 2 days, 3:15:00
print(td.days) # 2
print(td.seconds) # 11700
print(type(td)) # <class 'datetime.timedelta'>
* td.seconds 속성은 하루 미만의 초만 (0~86399)
=> days를 포함한 전체 초는 total_seconds() - 아래 참고
timedelta 연산
from datetime import datetime, timezone, timedelta
# datetime과 timedelta 연산
dt = datetime(2025, 10, 15, 9)
dt_plus = dt + timedelta(hours=2) # 두시간 뒤 (11시)
dt_minus = dt - timedelta(days=1) # 하루 전 (9시)
# datetime 연산 (결과는 timedelta 타입)
delta = datetime(2025,10,15,12) - datetime(2025,10,15,9) # 3시간
# timedelta 연산
2 * timedelta(minutes=30) # 1시간
timedelta(hours=3) / 2 # 1시간 30분
timedelta(hours=3) / timedelta(hours=1) # 3.0 (float 비율)
* total_seconds()
from datetime import timedelta
timedelta(hours=3).total_seconds() # 10800.0
timedelta(days=1, seconds=30).total_seconds() # 86430.0
timedelta(seconds=1, microseconds=500_000).total_seconds() # 1.5
(-timedelta(minutes=2, seconds=30)).total_seconds() # -150.0
strptime
str 문자열 -> datetime 변환
from datetime import datetime
# 1) "YYYY-MM-DD HH:MM:SS"
dt1 = datetime.strptime("2025-10-15 09:30:45", "%Y-%m-%d %H:%M:%S")
# 2) "YYYY/MM/DD"
dt2 = datetime.strptime("2025/10/15", "%Y/%m/%d")
# 3) "DD-MM-YYYY"
dt3 = datetime.strptime("15-10-2025", "%d-%m-%Y")
# 4) 밀리초 & 마이크로초
dt4 = datetime.strptime("2025-10-15 09:30:45", "%Y-%m-%d %H:%M:%S")
dt5 = datetime.strptime("2025-10-15 09:30:45.123456", "%Y-%m-%d %H:%M:%S.%f") # 밀리초는 %f의 일부로 표현
strftime
datetime -> str 문자열 변환
from datetime import datetime, timezone
dt = datetime(2025, 10, 15, 9, 30, 45)
# 1) "YYYY-MM-DD HH:MM:SS"
s1 = dt.strftime("%Y-%m-%d %H:%M:%S") # "2025-10-15 09:30:45"
# 2) "YYYY/MM/DD"
s2 = dt.strftime("%Y/%m/%d") # "2025/10/15"
# 3) 요일 + 시분
s3 = dt.strftime("%A %H:%M") # 예: "Wednesday 09:30"
# 4) 마이크로초
s4 = dt.strftime("%Y-%m-%d %H:%M:%S.%f") # "2025-10-15 09:30:45.000000"
https://docs.python.org/ko/3/library/datetime.html#strftime-strptime-behavior
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 attr...
docs.python.org