from datetime import datetime, timezone, timedelta
import pytz
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dates
Python 내장 패키지를 사용하면 utc timezone 을 설정할 수 있습니다.
timezone.utc
datetime.timezone.utc
# timezone unawared datetime
datetime(2019,1,1)
datetime.datetime(2019, 1, 1, 0, 0)
# timezone awared datetime
datetime(2019,1,1,tzinfo=timezone.utc)
datetime.datetime(2019, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)
그러나 utc 외 timezone 을 표시하기 어렵기 때문에 pytz 패키지를 사용합니다.
datetime(2019,1,1,tzinfo=timezone.utc) == pytz.UTC.localize(datetime(2019,1,1))
True
# 한국 표준시
KST = pytz.timezone('Asia/Seoul')
datetime(2019,1,1,tzinfo=timezone.utc) == KST.localize(datetime(2019,1,1))
False
# timezone unawared datetime
mydate = datetime(2019,1,1)
mydate
datetime.datetime(2019, 1, 1, 0, 0)
# timezone awared datetime
mydate_kst = KST.localize(mydate)
mydate_kst
datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>)
# timezone conversion
mydate_kst.astimezone(pytz.utc)
datetime.datetime(2018, 12, 31, 15, 0, tzinfo=<UTC>)
mydate_kst.astimezone(pytz.utc) == mydate_kst
True
timezone awared datetime 을 문자열로 표시할 때도 timezone 정보를 포함시킬 수 있습니다.
# strftime.org 참조
mydate_kst.strftime("%Y-%m-%d %H:%M:%S%Z")
'2019-01-01 00:00:00KST'
mydate_kst.astimezone(pytz.utc).strftime("%Y-%m-%d %H:%M:%S%Z")
'2018-12-31 15:00:00UTC'
today = datetime.today()
today 메서드는 시스템에 설정된 환경정보에 따라 timezone 정보 없이 데이터를 리턴하므로 다른 환경의 다른 컴퓨터에서 같은 코드를 실행할 시 문제를 발생시킬 수 있습니다. 절대적인 값으로 현재 시각을 가져올 방법이 필요합니다. utcnow 함수는 UTC 기준의 현재 시각을 리턴합니다.
# utc 표준시 이지만 time unawared datetime 입니다.
datetime.utcnow()
datetime.datetime(2019, 1, 31, 8, 40, 49, 276846)
# time awared datetime 으로 만들어 사용
datetime.utcnow().astimezone(KST)
datetime.datetime(2019, 1, 31, 8, 42, 47, 131384, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>)
요일 가져오기
# 요일 가져오기; 0:월, 1:화, ... , 6:일
datetime(2019,1,23).weekday()
2
today.weekday()
3
시간차 정보 다루기
# UTC 시간과 KST 시간 차이는 9시간
pytz.utc.localize(mydate) - KST.localize(mydate)
datetime.timedelta(seconds=32400)
# UTC 시간에 9시간을 더하기
pytz.utc.localize(mydate) + timedelta(seconds=32400)
datetime.datetime(2019, 1, 1, 9, 0, tzinfo=<UTC>)
def last_friday():
today = KST.localize(datetime.today())
offset = 4 - today.weekday() % 4
aweekago = today - timedelta(weeks=1)
last_friday = aweekago + timedelta(days=offset)
return last_friday
last_friday()
datetime.datetime(2019, 1, 25, 17, 48, 32, 512183, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>)