Python의 날짜 및 시간 관련 패키지 소개

datetime 패키지

  • 서브 패키지
    • datetime 클래스 : 날짜+시간 복합 정보
    • date 클래스: 날짜 정보
    • time 클래스: 시간 정보
    • timedelta 클래스: 시간 차이 정보
    • tzinfo 클래스: 시간대 정보

In [1]:
import datetime

datetime.datetime 클래스

  • 날짜와 시간 정보를 가지는 객체
  • Class Methods
    • now([tz]): 현재 시각
    • strptime(date_string, format): 문자열 -> datetime
    • fromtimestamp(): timestamp -> datetime
    • fromordinal(ordinal): proleptic Gregorian ordinal (엑셀 날짜) -> datetime
    • combine(date, time): date + time -> datetime

현재시각


In [2]:
dt = datetime.datetime.now()
dt


Out[2]:
datetime.datetime(2016, 8, 23, 7, 13, 28, 664000)

In [3]:
type(dt)


Out[3]:
datetime.datetime
  • Instance Attributes 속성
    • year, month, day, hour, minute, second, microsecond
    • tzinfo
  • Instance Methods 메소드
    • weekday(): 요일 {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}
    • strftime(format): datetime -> 문자열
    • toordinal(): datetime -> proleptic Gregorian ordinal (엑셀 날짜)
    • date(): datetime -> date
    • time(): datetime -> time

In [4]:
dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo


Out[4]:
(2016, 8, 23, 7, 13, 28, 664000, None)

In [5]:
dt.weekday() #  {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}


Out[5]:
1

문자열 변환

  • Parsing
    • 문자열 -> datetime
    • strptime(date_string, format)
  • Formatting
    • datetime -> 문자열
    • strftime(format)

In [7]:
dt1 = datetime.datetime.strptime("2016-08-23 07:20", "%Y-%m-%d %H:%M")
dt1


Out[7]:
datetime.datetime(2016, 8, 23, 7, 20)

In [8]:
dt1.strftime("%d/%m/%y")


Out[8]:
'23/08/16'

In [11]:
dt1.strftime("%A %d. %B %Y")


Out[11]:
'Tuesday 23. August 2016'

In [12]:
s = dt1.strftime("%Y년 %m월 %d일 %H시 %M분 %S초")
print(s)


2016년 08월 23일 07시 20분 00초

In [13]:
s = dt1.strftime(u"%Y년 %m월 %d일 %H시 %M분 %S초".encode("utf-8"))
print(s)


2016년 08월 23일 07시 20분 00초

datetime, date, time 변환

  • datetime -> date 또는 time
    • date() 메소드 또는 time() 메소드
  • date + time -> datetime
    • combine() 메소드

In [14]:
dt = datetime.datetime.now()
dt


Out[14]:
datetime.datetime(2016, 8, 23, 7, 25, 59, 443000)

In [15]:
dt.date(), dt.time()


Out[15]:
(datetime.date(2016, 8, 23), datetime.time(7, 25, 59, 443000))

In [16]:
d = datetime.date(2015, 12, 31)
d


Out[16]:
datetime.date(2015, 12, 31)

In [19]:
t = datetime.time(7, 27, 30)
t


Out[19]:
datetime.time(7, 27, 30)

In [20]:
datetime.datetime.combine(d, t)


Out[20]:
datetime.datetime(2015, 12, 31, 7, 27, 30)

timedelta와 날짜시간 연산

  • 빼기

    • datetime - datetime => timedelta
  • 더하기

    • datetime + timedelta => datetime

In [21]:
dt1 = datetime.datetime(2016, 8, 23, 16)
dt2 = datetime.datetime(2016, 4, 1, 4)
td = dt1- dt2
td


Out[21]:
datetime.timedelta(144, 43200)

timedelta 클래스

  • 속성

    • days: 일수
    • seconds: 초. (0 ~ 86399)
    • microseconds: 마이크로초 (0 and 999999)
  • 메소드

    • total_seconds(): 모든 속성을 초단위로 모아서 변환

In [22]:
td.days, td.seconds, td.microseconds


Out[22]:
(144, 43200, 0)

In [23]:
td.total_seconds()


Out[23]:
12484800.0

time 패키지

sleep 함수

  • 일정 시간 동안 프로세스 정지

In [24]:
import time
print("start...")
time.sleep(1)
print(1)
time.sleep(2)
print(2)
time.sleep(3)
print(3)
time.sleep(4)
print(4)
time.sleep(1)
print("finish!")


start...
1
2
3
4
finish!

time 패키지의 시간 표시

  • time_struct
    • 9-tuple 내부 구조체
  • 단일 부동소수점 숫자
    • 시간을 하나의 숫자로 표시 가능
    • time 패키지의 모든 시각은 epoch로부터 흐른 초단위 숫자로 표시
    • epoch
    • 1970년 1월 1일 0시 기준

time package 명령어

  • time(): 현재 시각을 단일 부동소수점 숫자로 반환
  • localtime(): 현재 시각을 time_struct로 반환
  • mktime(ts): time_struct -> 단일 부동소수점 숫자 변환

In [25]:
time.time()


Out[25]:
1471905279.816

In [26]:
ts = time.localtime()
ts


Out[26]:
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=23, tm_hour=7, tm_min=34, tm_sec=48, tm_wday=1, tm_yday=236, tm_isdst=0)

In [27]:
time.mktime(ts)


Out[27]:
1471905288.0

pytz 패키지

  • 세계 시간대 변환

In [28]:
import pytz

In [30]:
seoul = pytz.timezone("Asia/Seoul")
seoul


Out[30]:
<DstTzInfo 'Asia/Seoul' LMT+8:28:00 STD>

datetime 객체에 시간대 정보 넣기

  • localize 메소드

In [31]:
t1 = datetime.datetime.now()
t1


Out[31]:
datetime.datetime(2016, 8, 23, 7, 37, 1, 325000)

In [32]:
lt1 = seoul.localize(t1)
lt1


Out[32]:
datetime.datetime(2016, 8, 23, 7, 37, 1, 325000, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>)

In [33]:
t2 = datetime.datetime.utcnow()
t2


Out[33]:
datetime.datetime(2016, 8, 22, 22, 37, 58, 854000)

In [34]:
lt2 = pytz.utc.localize(t2)
lt2


Out[34]:
datetime.datetime(2016, 8, 22, 22, 37, 58, 854000, tzinfo=<UTC>)

In [35]:
lt3 = t2.replace(tzinfo=pytz.utc)
lt3


Out[35]:
datetime.datetime(2016, 8, 22, 22, 37, 58, 854000, tzinfo=<UTC>)

타시간대로 변환

  • astimezone 메소드

In [36]:
t1 = datetime.datetime.now()
lt1 = seoul.localize(t1)
lt4 = lt1.astimezone(pytz.timezone("US/Eastern"))
lt4


Out[36]:
datetime.datetime(2016, 8, 22, 18, 39, 39, 124000, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

dateutil

  • parse 함수
  • relativedelta 클래스

parse() 함수

  • 많이 사용되는 날짜 시간 관련 문자열 형식을 스스로 판단

In [37]:
from dateutil.parser import parse

In [38]:
parse('2016-08-23')


Out[38]:
datetime.datetime(2016, 8, 23, 0, 0)

In [39]:
parse("Aug 23, 2016 07:40:33 AM")


Out[39]:
datetime.datetime(2016, 8, 23, 7, 40, 33)

In [41]:
parse('7/7/2009')


Out[41]:
datetime.datetime(2009, 7, 7, 0, 0)