Python/공부공부

[python] 날짜&시간 연산 (datetime, timedelta, strptime, strftime)

phyho 2025. 10. 15. 10:22

 

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