※ 일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용이 있다면 지적 부탁드립니다.
python의 표준 라이브러리 dattime을 사용하여 날짜(날짜나 시간) 데이터를 처리할 수 있다. 날짜와 문자열을 상호 변환하는 메소드 strtime()과 strptime()으로 다양한 포맷의 날짜나 시간을 조작할 수 있다.
또한, 뺄셈이나 덧셈등의 연산도 가능하다. 예를 들어 10일 전이라던가 3주 이후의 날짜나 50분후의 사간 등 간단한 계산도 할 수 있다는 것이다.
이번 포스트에서 다룰 내용은 다음과 같다.
- datetime.datetime : 일시(날짜와 시간)
- datetime.date : 날짜
- datatime.time : 시각
- datetime.timedelta : 시간차, 경과 시간
위의 클래스 오브젝트에 대해서 설명한 후에, 날짜와 문자열을 상호 변환하는 메소드 strtime()과 strptime()에 대해서 설명한다.
- datetime오브젝트
- datetime.now(): 오늘의 날짜와 현재 시각
- datetime오브젝트의 컨스트럭터
- datetime오브젝트에서 date오브젝트로 변환
- date오브젝트
- date.today(): 오늘의 날짜
- date오브젝트의 컨스트럭터
- time오브젝트
- time오브젝트의 컨스트럭터
- timedelta오브젝트
- datetime, date오브젝트의 뺄셈으로timedelta오브젝트를 생성
- timedelta오브젝트의 컨스트럭터
- timedelta오브젝트를 사용한 덧셈, 뺄셈
- strftime(): 날짜, 시간 데이터에서 문자열 데이터로 변환
- strptime():문자열 데이터에서 날짜, 시간 데이터로 변환
datetime오브젝트
datetime 오브젝트는 날짜(년,월,일)과 시각(시, 분, 초 마이크로초) 정보를 가진 오브젝트이다. 이러한 정보는 속성 year, month, day, hour, minute, second, microsecond 을 사용할 수 있다.
datetime.now(): 오늘의 날짜와 현재 시각
datetime.now()로 오늘의 날짜(현재의 날짜)와 현재 시간의 datetime 오브젝트를 얻을 수 있다.
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231
print(type(dt_now))
# <class 'datetime.datetime'>
print(dt_now.year)
# 2018
print(dt_now.hour)
# 18
datetime오브젝트의 컨스트럭터
임의의 날짜, 시간의 datetime 오브젝트를 생성하는 것도 가능하다. datetime 오브젝트의 컨스트럭터는 아래와 같다.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
연도 year, 월 month, 일 day는 필수 항목이며 그 외는 생략 가능ㅎ다ㅏ. 생략한 경우는 초기값 0이 된다.
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000
print(dt.minute)
# 15
print(dt.microsecond)
# 2000
dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00
print(dt.minute)
# 0
datetime오브젝트에서 date오브젝트로 변환
datetiem 오브젝트는 date()메소드로 다음에 설명할 date오브젝트로 변환이 가능하다.
print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>
print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>
date오브젝트
date 오브젝트는 날짜(년, 월, 일) 의 정보를 가진 오브젝트이며 속성으로는 year, month, day가 있다.
date.today(): 오늘의 날짜
date.today() 으로 현재의 날짜(오늘의 날짜)의 date 오브젝트를 얻을 수 있다.
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
date오브젝트의 컨스트럭터
date 오브젝트의 컨스트럭터는 아래와 같다.
date(year, month, day)
모두 필수 항목이라 생략이 불가능하다.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
time오브젝트
time 오브젝트는 시각(시, 분, 초, 마이크로초)의 정보를 가진 오브젝트이며, 속성으로는 hour, minute, second, microsecond가 있다.
time오브젝트의 컨스트럭터
time 오브젝트의 컨스트럭터는 아래와 같다.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
모두 생략가능하며, 생략했을 경우 0으로 설정된다.
t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000
print(type(t))
# <class 'datetime.time'>
print(t.hour)
# 12
t = datetime.time()
print(t)
# 00:00:00
timedelta오브젝트
timedelta 오브젝트는 두 개의 일시 시간차, 경과 시간을 나타내는 오브젝트로, 일 수, 초 수, 마이크로 초 수의 정보를 가지며, 속성으로는 days, seconds, microseconds가 있다. 또한, total_seconds() 메소드로 토탈 초 수를 얻을 수 있다.
datetime, date오브젝트의 뺄셈으로timedelta오브젝트를 생성
두 datetime 오브젝트을 뺄셈하면 timedelta 오브젝트를 얻을 수 있다.
td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231
print(type(td))
# <class 'datetime.timedelta'>
print(td.days)
# 1
print(td.seconds)
# 66673
print(td.microseconds)
# 271231
print(td.total_seconds())
# 153073.271231
date 오브젝트끼리 뺄셈해도 동일하게 timedelta 오브젝트를 얻을 수 있다.
timedelta오브젝트의 컨스트럭터
timedelta 오브젝트의 컨스트럭터는 아래와 같다.
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
모두 생략 가능하며, 생략할 경우 0으로 설정된다. 또한, timedelta 오브젝트가 보유하고 있는 것은 어디까지나 일수 days, 초수 seconds, 마이크로 초수 microseconds 의 정보뿐이므로 weeks = 1은 days = 7과 동일하다.
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
초를 분이나 시간으로 변환하는 것도 가능하나 여기서는 다루지 않겠다.
timedelta오브젝트를 사용한 덧셈, 뺄셈
timedelta 오브젝트는 datetime 오브젝트나 date 오브젝트와 뺄셈이나 덧셈등의 연산이 가능하다. 예를 들어 일주일전이나 10일 후의 날짜나 50분 후의 시간 등을 간단한 계산으로 얻어 낼 수 있다.
d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26
td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00
dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231
td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00
print(td_50m.seconds)
# 3000
dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231
특정 날짜까지의 일 수와 같은 값을 계산해낼 수 있다.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
시차(타임존)를 다룰 경우의 처리도 가능하지만 이번 포스트에서는 설명을 생략하도록 하겠다.
strftime(): 날짜, 시간 데이터에서 문자열 데이터로 변환
datetime 오브젝트, date 오브젝트의 strtime()메소드로 일시(날짜, 시간)의 정보를 임의의 포맷의 문자열로 변환할 수 있다.
변환식 코드
사용할 수 잇는 변환식 코드는 아래와 같다(일부).
- %d : 0으로 메운 10 진수로 표시한 일
- %m : 0으로 메운 10진수로 표시한 월
- %y : 0으로 메운 10진수로 표시한 서양력(2자리)
- %Y : 0으로 메운 10진수로 표시한 서양력(4자리)
- %H :0으로 메운 10진수로 표시한時 (24시간 표기)
- %I : 0으로 메운 10진수로 표시한 시(12시간 표기)
- %M : 0으로 메운 10진수로 표시한 분
- %S : 0으로 메운 10진수로 표시한 초
- %f : 0으로 메운 10진수로 표시한 마이크로 초(6자리)
- %A : 로컬의 요일명
- %a : 로컬의 요일명(축약형)
- %B : 로컬의 월 명
- %b : 로컬의 일 명(축약형)
- %j : 0으로 메운 10진수로 표시한 연도의 일(정월이 001로 표기됨)
- %U : 0으로 메운 10진수로 표시한 연도의 주 번호(한 주가 시작되는 날은 일요일)
- %W : 0으로 메운 10진수로 표시한 연도의 주 번(한 주가 시작되는 날은 월요일)
요일명이나 월명의 %A, %a, %B, %b는 로컬 환경에 따라 얻어지는 문자열이 달라진다. 또한, ISO 8601 형식의 문자열에 대해서는 전용 메소드가 기존에 존재한다.
샘플코드
print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13
print(d_today.strftime('%y%m%d'))
# 180202
print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018
print(d_today.strftime('%Y年%m月%d日'))
# 2018년02월02일
print('일 번호(1년의 몇번째 일인가/ 정월이001):', d_today.strftime('%j'))
print('주 번호(주 시작은 일요일 / 정월이00):', d_today.strftime('%U'))
print('주 번호(주 시작은 월요일 / 정월이00):', d_today.strftime('%W'))
# 일 번호(1년의 몇번째 일인가/ 정월이001): 033
# 주 번호(주 시작은 일요일 / 정월이00: 04
# 주 번호(주 시작은 월요일 / 정월이00): 05
문자열이 아닌 숫자형 데이터를 얻어내고 싶은 경우는 int()로 변환해주면 된다.
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
timedelta 오브젝트와 함께, 예를 들어, 임의의 포맷으로 격주의 날짜 리스트를 만드는 것도 가능하다.
d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y年%m月%d日'
l = []
for i in range(n):
l.append((d + i * td).strftime(f))
print(l)
# ['2018年02月01日', '2018年02月15日', '2018年03月01日', '2018年03月15日', '2018年03月29日', '2018年04月12日', '2018年04月26日', '2018年05月10日']
print('\n'.join(l))
# 2018年02月01日
# 2018年02月15日
# 2018年03月01日
# 2018年03月15日
# 2018年03月29日
# 2018年04月12日
# 2018年04月26日
# 2018年05月10日
리스트 내장 함수를 사용하면 더욱 간단하게 가능하다.
l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018年02月01日', '2018年02月15日', '2018年03月01日', '2018年03月15日', '2018年03月29日', '2018年04月12日', '2018年04月26日', '2018年05月10日']
strptime():문자열 데이터에서 날짜, 시간 데이터로 변환
datetime의 strptime()을 사용하면, 날짜나 시각을 표시하는 문자열을 datetime 오브젝트로 변환할 수 있다. 원래 문자열 데이터에 대응하는 형식화 문자열을 지정할 필요가 있다.
샘플 코드
date_str = '2018/2/1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y/%m/%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00
print(type(date_dt))
# <class 'datetime.datetime'>
얻어진 datetime 오브젝트로 strftime() 메소드를 사용하는 것으로 원래 문자열과 다른 포맷으로 일자나 시각을 표시하는 것도 가능하다.
print(date_dt.strftime('%Y년%m월%d일 %H시%M분'))
# 2018년02월01일 12시30분
datetime 오브젝트로 변환하면 timedelta 오브젝트로와의 연산도 가능해지므로, 예를 들어 동일 포맷으로 10일전의 문자열을 생성하는 것도 가능하다.
date_str = '2018년2월1일'
date_format = '%Y년%m월%d일'
td_10_d = datetime.timedelta(days=10)
date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)
print(date_str_new)
# 2018년01월22일
참고자료
'IT > 언어' 카테고리의 다른 글
[python/openCV] 가로세로 비율을 유지한 채로 이미지를 리사이즈하기(이미지 사이즈 변경) (0) | 2022.08.08 |
---|---|
[python/scipy] scipy.interpolate.interp2d를 이용한 2차원 데이터 보간 (0) | 2022.08.04 |
[python] 순서를 지정할 수 있는 dictionary ; OrderedDict의 사용법 (0) | 2022.07.26 |
[python] 시간을 10분 단위로만 기록되도록 하기(시간 내림) (0) | 2022.07.24 |
[python] Requests를 이용해 Web API 호출하기(데이터 획득, 조작) (0) | 2022.05.28 |