본문 바로가기
파이썬/기초문법

Python 날짜 다루기 datetime, dateutil, timedelta

by 행복론자 2020. 1. 24.

Python에서 날짜는 기본 자료형이 아니지만 시계열 데이터를 다루는데 빠질 수 없는 자료입니다.

 

datetime 패키지는 

datetime, time, timedelta 클래스를 제공합니다.

 

datetime 패키지에는 패키지명과 같은 클래스(datetime)가 있음에 주의해야합니다.

datetime을 이용해 현재 시각을 알아보겠습니다.

import datetime

time_now = datetime.datetime.now()
print(time_now)

 

 

datetime.datetime 클래스로부터 만들어진 time_now를 통해 

연도, 월, 일, 시, 분, 초, 마이크로초를 알아낼 수 있습니다.

import datetime

time_now = datetime.datetime.now()

print(time_now.year)
print(time_now.month)
print(time_now.day)
print(time_now.hour)
print(time_now.minute)
print(time_now.microsecond)

 

 

또 다른 weekday(),date(),time()과 같은 메소드들도 존재합니다.

import datetime

time_now = datetime.datetime.now()

print(time_now.weekday()) # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
print(time_now.date()) # 날짜만 가져오기 (시간 X)
print(time_now.time()) # 시간만 가져오기 (날짜 X))

 

 

그중에서도 strftime이라는 메소드를 많이 사용합니다.

time_now는 datetime.datetime의 인스턴스라 불편한 점이 있을 수  있습니다.

print(type(time_now)) # <class 'datetime.datetime'>

 

 

예를 들면 dictionary에 날짜별로 데이터를 넣었는데 단순히 str을 전달하면 datetime이 아니므로 찾지 못합니다.

이런 상황에서 필요한 것이 str로 바꿔주는 strftime 메소드입니다.

import datetime

time_now = datetime.datetime.now()

print(type(time_now)) # <class 'datetime.datetime'>
print(time_now.strftime("%A %d. %B %Y")) #Friday 24. January 2020
print(type(time_now.strftime("%A %d. %B %Y"))) # <class 'str'>

 

 

str 타입으로 변환과정에서 변환 포맷을 지정할 수 있는데 이때 필요한게 지정문자 (%A %d %B %Y와 같은)입니다.

이 지정문자에 대해서는 

 

https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior

 

공식문서에 잘 나와 있습니다.

 

 

다음은 dateutil 패키지에 대한 내용입니다.

dateutil 패키지에 있는 parse를 사용하면 날짜 형식을 대충 넣어도 datetime.datetime 객체로 잘 바꿔줍니다.

무슨 말이냐면

import datetime

time_set = datetime.datetime(2020,1,01) # 0넣으면 안됨, 에러 
time_set2 = datetime.datetime(2020,1,1)
print(time_set)

 

 

datetime.datetime를 만들 때는 지정한 형식대로 인자를 전달해야 합니다.

하지만 parse를 이용하면  대충해도 알아서 잘 만듭니다

import datetime
from dateutil.parser import parse

time_set = parse('2020-1-01') #가능
time_set2 = datetime.datetime(2019,1,1) #가능
time_set3 = parse('11-11-2020') #가능

 

 

다음은 datetime 객체끼리의 연산, timedelta 사용법입니다.

기준일로부터 특정일이 얼마나 지났나와 같은 연산을 할 때 사용하는 클래스입니다.

import datetime

time1 = datetime.datetime(2020, 1, 1, 1)
time2 = datetime.datetime(2020, 1, 24, 13)
diff = time2 - time1

print(diff) # 23 days, 12:00:00
print(type(diff)) # <class 'datetime.timedelta'>

 

 

datetime, time1과 time2의 차이를 구하기 위해 (-) 연산을 하면 정말 며칠, 몇시간 차이인지 나옵니다.

이 차이를 구한 diff는 datetime.timedelta의 인스턴스입니다.

datetime.timedelta의 인스턴스가 사용할 수 있는 기본 메소드들이 있습니다.

예를 들어 날짜만 알고 싶다. 초만 알고 싶다고 하면 아래와 같이 days(), seconds()와 같은 메소드를 호출하면 됩니다.

import datetime

time1 = datetime.datetime(2020, 1, 1, 1)
time2 = datetime.datetime(2020, 1, 24, 13)
diff = time2 - time1

print(diff) # 23 days, 12:00:00
print(type(diff)) # <class 'datetime.timedelta'>
print(diff.days) # 23
print(diff.seconds) # 43200
print(diff.total_seconds()) # 2030400.0

 

 

반대로 특정일을 기준으로 며칠, 몇초가 지난 후의 시간을 알고 싶다고 하면 (+)을 사용하면 됩니다.

다만 이 연산에서는 위의 (-)와 다르게 datetime.datetime 객체끼리의 연산이 아니라 

datetime.datetime와 datetime.timedelta 사이의 연산이어야합니다.

이에 대한 코드를 첨부합니다.

import datetime

time1 = datetime.datetime(2020, 1, 1, 1)
time2 = datetime.timedelta(days=23, seconds=3600)
sum = time2 + time1

print(sum) #2020-01-24 02:00:00

 

 

 

 

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글