[python] 날짜와 시간 다루기
파이썬에서 날짜와 시간 다루기
datetime 패키지
datetime 패키지에서는 날짜와 시간을 함께 저장하는 datetime 클래스, 날짜만 저장하는 date 클래스, 시간만 저장하는 time 클래스, 시간 구간 정보를 저장하는 timedelta 클래스 등을 제공한다.
import datetime as dt
result = dt.datetime.now() # 현재 시간을 가져온다.
<결과> 2024-01-12 15:15:50.228656
result = dt.datetime(2024, 1, 12, 13, 30, 1) # 일반적인 날짜를 datetime 객체로 변경한다.
<결과> 2024-01-12 13:30:01
datetime 속성
datetime 클래스 객체는 다음과 같은 속성을 가진다.
- year: 연도
- month: 월
- day: 일
- hour: 시
- minute: 분
- second: 초
- microsecond: 마이크로초(micro seconds, 백만분의 일초)
result.year # 년도를 반환한다.(2024)
....
result.minute # 분을 반환한다.(30)
datetime 메서드
- weekday: 요일 반환 (0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일)
- strftime: 문자열 반환
- date: 날짜 정보만 가지는 date 클래스 객체 반환
- time: 시간 정보만 가지는 time 클래스 객체 반환
result.weekday() # 4
result.date() # 2024-01-12
result.time() # 13:30:01
result.strftime("%A %d. %B %Y") # Friday 12. January 2024
result.strftime("%H시 %M분 %S초") # 13시 30분 01초
strftime
아래는 strftime에 사용가능한 format type이다.
- %Y: 앞의 빈자리를 0으로 채우는 4자리 연도 숫자
- %m: 앞의 빈자리를 0으로 채우는 2자리 월 숫자
- %d: 앞의 빈자리를 0으로 채우는 2자리 일 숫자
- %H: 앞의 빈자리를 0으로 채우는 24시간 형식 2자리 시간 숫자
- %M: 앞의 빈자리를 0으로 채우는 2자리 분 숫자
- %S: 앞의 빈자리를 0으로 채우는 2자리 초 숫자
- %A: 영어로 된 요일 문자열
- %B: 영어로 된 월 문자열
strptime
특정 포맷의 문자열을 datetime 클래스 객체로 변경
dt.datetime(2024, 1, 12, 13, 30, 1) 처럼 사용도 가능하지만 strptime 을 이용하면 문자열을 그대로 변경 가능하여 유용하다.
dt.datetime.strptime("2024-01-12 13:30", "%A-%m-%d %H:%M")
예제
dt.datetime.now().strftime("%Y-%m-%d") # 2024-03-14
(dt.datetime.now() + dt.timedelta(days=-1)).strftime("%Y%m%d") # 하루전 날짜 출력 20240313
dateutil 패키지
strptime 클래스 메서드를 사용할 때는 문자열에 맞는 형식 문자열을 사용자가 제공해야 한다. 그러나 dateutil 패키지의 parse 함수를 쓰면 자동으로 형식 문자열을 찾아 datetime 클래스 객체를 만들어 준다.
from dateutil.parser import parse
parse(parse('2024-01-12 15:30:25')) # 2024-01-12 15:30:25
parse('1/12/2024') # 2024-01-12 00:00:00
날짜와 시간 연산
날짜와 시간 차(timedelta)
dt1 = dt.datetime(2024, 1, 12, 15, 40, 20)
dt2 = dt.datetime(2023, 12, 30, 14, 30, 25)
diff = dt1 - dt2 # 13 days, 1:09:55 # timedelta 객체
timedelta 속성
- days: 일수
- seconds: 초 (0 ~ 86399)
- microseconds: 마이크로초 (0 and 999999)
timedelta 메소드
- total_seconds: 모든 속성을 초단위로 모아서 변환
diff.days # 13
diff.seconds # 4195
diff.microseconds # 0
diff.total_seconds() # 1127395.0
today = dt.datetime.now() # 2024-01-12 16:33:24.751756
day10 = dt.timedelta(days=10) # 10 days, 0:00:00 (10일이라는 시간을 생성)
before_10day = today - day10; # 2024-01-02 16:33:24.751756 (오늘로 부터 10일전의 날짜를 구할 수 있다)
time 패키지
time.sleep(5)
예제
하루씩 날짜 올리기
start = dt.datetime(2021, 1, 1)
day = dt.timedelta(days=1)
while start < dt.datetime.now():
start = start + day