Logo

파이썬의 datetime 모듈로 날짜/시간 처리하기

어떤 언어를 사용하든지 프로그래밍을 하면서 날짜와 시간 처리는 피하기 어려운 부분입니다. 파이썬은 내장 모듈인 datetime을 통해서 어떻게 날짜와 시간 데이터를 처리를 지원하고 있는지 알아보겠습니다.

timedelta

datetime 내장 모듈의 timedelta 클래스는 기간을 표현하기 위해서 사용됩니다.

timedelta 클래스의 생성자는 주, 일, 시, 분, 초, 밀리 초, 마이크로 초를 인자로 받습니다.

>>> from datetime import timedelta
>>> timedelta(days=5, hours=17, minutes=30)
datetime.timedelta(days=5, seconds=63000)

timedelta 객체는 내부적으로 일, 초, 마이크로 초 단위만 저장하기 때문에 위와 같이 해당 정보만 표시됩니다.

파이썬의 날짜/시간 계산은 다른 언어에 비해서 매우 간결하고 직관적인데요. 바로 이 timedelta 객체와 함께 산술/대소 연산자를 사용할 수 있기 때문입니다.

>>> from datetime import date, timedelta
>>> today = date.today()
>>> today
datetime.date(2020, 7, 18)
>>> one_week = timedelta(weeks=1)
>>> one_week
datetime.timedelta(days=7)
>>> next_week = today + one_week
>>> next_week
datetime.date(2020, 7, 25)
>>> two_weeks = one_week * 2
>>> two_weeks
datetime.timedelta(days=14)
>>> one_week < two_weeks
True
>>> two_weeks == timedelta(weeks=14)
True
>>> last_week = next_week - two_weeks
>>> last_week
datetime.date(2020, 7, 11)

위와 같이 앞으로 다룰 datetime, datetime 객체를 대상으로 유연한 날짜/시간 계산을 할 수 있습니다.

timezone

datetime 내장 모듈의 timezone 클래스는 시간대를 표현하기 위해서 사용됩니다.

timezone 클래스의 생성자는 UTC 기준으로 시차를 표현하는 timedelta 객체를 인자로 받아 timezone 객체를 생성해줍니다. 예를 들어, 한국은 UTC 기준으로 9시간이 빠르므로 다음과 같이 timezone 객체를 생성할 수 있습니다.

>>> from datetime import timedelta, timezone
>>> timezone(timedelta(hours=9))
datetime.timezone(datetime.timedelta(seconds=32400))

모든 시간대의 기준이 되는 UTC 시간대는 utc 속성을 통해 바로 얻을 수 있습니다.

>>> timezone(timedelta(0))
datetime.timezone.utc
>>> timezone.utc
datetime.timezone.utc

timezone 객체는 앞으로 다룰 timedatetime 객체의 tzinfo 속성값으로 사용됩니다.

date

datetime 내장 모듈의 date 클래스는 날짜를 표현하는데 사용됩니다.

date 클래스의 생성자는 연, 월, 일 데이터를 인자로 받습니다.

>>> from datetime import date
>>> date(2019, 12, 25)
datetime.date(2019, 12, 25)

오늘 날짜를 얻고 싶다면 date 클래스의 today() 메서드를 사용합니다.

>>> date.today()
datetime.date(2020, 7, 18)

date 클래스의 isoformat() 메서드는 date 객체를 YYYY-MM-DD 형태의 문자열로 변환해줍니다.

>>> today.isoformat()
'2020-07-18'

반대로 date 클래스의 fromisoformat() 메서드는 YYYY-MM-DD 형태의 문자열을 date 객체로 변환해줍니다.

>>> date.fromisoformat('2020-07-18')
datetime.date(2020, 7, 18)

date 객체가 보관하고 있는 연, 월, 일 데이터는 각각 year, month, day 속성을 통해 접근할 수 있습니다.

>>> today = date.today()
>>> today.year
2020
>>> today.month
7
>>> today.day
18

date 클래스의 weekday()isoweekday() 메서드는 해당 날짜가 무슨 요일인지를 파악하기 위해서 사용됩니다. 두 메서드는 차이는 weekday()에서는 월요일이 0으로 시작하는 반면에, isoweekday()에서는 월요일이 1로 시작한다는 점입니다.

>>> today.weekday()
5
>>> today.isoweekday()
6

date 클래스의 replace 함수를 사용하면 date 객체의 연, 월, 일 데이터를 변경할 수 있습니다. 좀 더 엄밀히 얘기하면, date 객체는 불변(immutable)하기 때문에 속성값이 변경된 새로운 date 객체를 생성하여 반환합니다.

>>> today.replace(year=2019)
datetime.date(2019, 7, 18)

date 클래스는 시간에 대한 정보를 담지 않기 때문에 시간대(time zone) 개념을 지원하지 않습니다.

time

time 클래스는 시간을 표현하기 위해서 사용됩니다.

time 클래스의 생성자는 시, 분, 초, 마이크로 초, 시간대를 인자로 받습니다. 모든 인자가 필수 인자가 아니며, 생략할 경우, 0이 기본값으로 사용됩니다.

>>> from datetime import time
>>> time(13, 42, 35)
datetime.time(13, 42, 35)

time 클래스의 fromisoformat() 메서드는 HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]] 형태의 문자열을 time 객체로 변환해줍니다.

>>> time.fromisoformat('13:42:35.458+09:00')
datetime.time(13, 42, 35, 458000, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)))

반대로 time 클래스의 isoformat 메서드는 time 객체를 HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]] 형태의 문자열로 변환해줍니다.

>>> from datetime import time, timedelta, timezone
>>> t = time(13, 42, 35, 458000, tzinfo=timezone(timedelta(hours=9)))
>>> t.isoformat()
'13:42:35.458000+09:00'

time 객체가 보관하고 있는 시, 분, 초 데이터는 각각 hour, minute, second 속성을 통해 접근할 수 있습니다.

>>> t = time(13, 42, 35, 458000, tzinfo=timezone(timedelta(hours=9)))
>>> t.hour
13
>>> t.minute
42
>>> t.second
35
>>> t.microsecond
458000
>>> t.tzinfo
datetime.timezone(datetime.timedelta(seconds=32400))

time 클래스의 replace 메서드를 사용하면 time 객체의 시, 분, 초 데이터를 변경할 수 있습니다.

>>> t.replace(hour=14)
datetime.time(14, 42, 35, 458000, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)))

date 클래스와 마찬가지로 time 클래스도 불변하기 때문에 새로운 time 객체가 생성되어 반환됩니다.

datetime

datetime 클래스는 날짜와 시간을 동시에 표현하기 위해서 사용되며, 위에서 다룬 datetime 클래스에서 지원하는 대부분의 기능을 지원합니다.

datetime 클래스의 생성자는 연, 월, 일, 시, 분, 초, 마이크로 초, 시간대를 인자로 받습니다. 시간 이하의 인자는 필수 인자가 아니며 생략할 경우, 0이 기본값으로 사용됩니다.

>>> from datetime import datetime
>>> datetime(2020, 7, 18, 13, 26, 23)
datetime.datetime(2020, 7, 18, 13, 26, 23)

datetime 클래스의 combine() 메서드를 사용하면 기존에 생성해둔 datetime 객체를 활용해서 datetime 객체를 생성할 수 있습니다.

>>> from datetime import date, datetime, time
>>> d = date(2020, 7, 18)
>>> t = time(13, 26, 23)
>>> datetime.combine(d, t)
datetime.datetime(2020, 7, 18, 13, 26, 23)

현재 시각을 얻고 싶다면 datetime 클래스의 now() 메서드를 사용하면 됩니다. now() 메서드에 시간대를 인자로 넘기면 해당 시간대가 적용된 datetime 객체가 생성됩니다.

>>> from datetime import datetime, timezone
>>> datetime.now()
datetime.datetime(2020, 7, 18, 13, 40, 30, 20143)
>>> datetime.now(timezone.utc)
datetime.datetime(2020, 7, 18, 17, 41, 26, 814580, tzinfo=datetime.timezone.utc)

datetime 클래스의 strftime() 메서드는 datetime 객체를 다양한 포맷의 문자열로 변환해줍니다.

>>> today.strftime('%Y/%m/%d')
'2020/07/18'

반대로 datetime 클래스의 strptime() 메서드는 다양한 포맷의 문자열을 datetime 객체로 변환해줍니다.

>>> datetime.strptime('2020/07/18', '%Y/%m/%d')
datetime.datetime(2020, 7, 18, 0, 0)

datetime, date, time 클래스에서 모두 지원하는 strftime() 메서드와 달리 strptime() 메서드는 datetime 클래스에서만 지원하니 주의바랍니다.

strftime()strptime() 에서 지원하는 날짜/시간 포맷은 파이썬 공식 레퍼런스를 참고바랍니다.

전체 코드

본 포스팅에서 제가 작성한 전체 코드는 아래에서 직접 확인하고 실행해보실 수 있습니다.

https://dales.link/ogd

마치면서

이상으로 파이썬 스탠다드 라이브러리의 datetime 모듈을 사용해서 어떻게 날짜와 시간 데이터를 다루는지 알아보았습니다. datetime 내장 모듈에 대한 좀 더 자세한 내용은 아래 파이썬 공식 레퍼런스를 참고 바랍니다.

파이썬은 좀 더 간단한 시간 데이터 처리를 위해서 time 내장 모듈도 지원하고 있습니다. 이 부분에 대해서는 별도로 포스팅을 하였으니 아래 관련 포스팅를 참고 바랍니다.