작성자: admin 작성일시: 2016-04-15 20:52:25 조회수: 2295 다운로드: 122
카테고리: Python 태그목록:

파이썬에서 날짜와 시간 다루기

날짜와 시간은 파이썬에서 기본으로 제공하는 자료형에는 포함되어 있지 않지만 데이터 분석에 있어 빠질 수 없는 중요한 자료형이다. 여기에서는 날짜와 시간을 다루기 위한 패키지를 소개한다.

날짜와 시간과 관련된 기능을 제공하는 패키지는 다음고 같은 것들이 있다. 여기에서는 datetime 패키지와 dateutil 패키지에 대해서만 설명한다.

datetime 패키지

datatime 패키지에서는 날짜와 시간을 함께 저장하는 datetime 클래스, 날짜만 저장하는 date 클래스, 시간만 저장하는 time 클래스, 시간 구간 정보를 저장하는 timedelta 클래스 등을 제공한다.

먼저 datetime 패키지를 다음과 같이 임포트한다.

In:
import datetime

datetime.datetime 클래스

우선 datetime.datetime 클래스부터 알아보자. 패키지 이름과 클래스 이름이 datetime으로 같기 때문에 사용할 때 주의해야 한다. 또한 다른 클래스와 달리 클래스 이름이 대문자로 시작하지 않는다.

datetime.datetime 클래스에는 객체를 생성하지 않고도 바로 클래스에서 사용할 수 있는 클래스 메서드라는 것을 제공한다. 가장 대표적인 것이 현재 시각을 출력하는 now() 메서드이다.

In:
dt = datetime.datetime.now()
dt
Out:
datetime.datetime(2017, 5, 12, 14, 50, 31, 117791)

now() 메서드는 현재의 컴퓨터 시각을 datetime.datetime 클래스 객체로 만들어 반환한다. datetime.datetime 클래스 객체는 다음과 같은 속성을 가진다.

  • year: 년
  • month: 월
  • day: 일
  • hour: 시
  • minute: 분
  • second: 초
  • microsecond: 마이크로초(micro seconds, 백만분의 일초)
In:
dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond
Out:
(2017, 5, 12, 14, 50, 31, 117791)

다음과 같은 메서드도 제공한다.

  • weekday(): 요일 반환 (0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일)
  • strftime(): 문자열 반환
  • date(): 날짜 정보만 가지는 datetime.date 클래스 객체 반환
  • time(): 시간 정보만 가지는 datetime.time 클래스 객체 반환
In:
dt.weekday() #  {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}
Out:
4

이 중 특히 많이 사용되는 것이 날짜와 시간 정보를 문자열로 바꿔주는 strftime() 메서드이다. 이 메서드는 어떤 형식으로 문자열을 만들지 결정하는 형식 문자열을 인수로 받는다. 형식 문자열은 날짜 및 시간 지정 문자열을 포함한다. 다음은 많이 사용되는 날짜 및 시간 지정 문자열이다.

날짜 및 시간 지정 문자열 의미
%Y 앞의 빈자리를 0으로 채우는 4자리 연도 숫자
%m 앞의 빈자리를 0으로 채우는 2자리 월 숫자
%d 앞의 빈자리를 0으로 채우는 2자리 일 숫자
%H 앞의 빈자리를 0으로 채우는 24시간 형식 2자리 시간 숫자
%M 앞의 빈자리를 0으로 채우는 2자리 분 숫자
%S 앞의 빈자리를 0으로 채우는 2자리 초 숫자
%A 영어로 된 요일 문자열
%B 영어로 된 월 문자열

이밖의 다른 날짜 및 시간 지정 문자열에 대해서는 다음 링크를 참조한다.

예를 들어 위에서 저장한 변수 dt의 시간 정보는 다음과 같이 문자열로 바꿀 수 있다.

In:
dt.strftime("%A %d. %B %Y")
Out:
'Friday 12. May 2017'
In:
print(dt.strftime("%H시 %M분 %S초"))
14시 50분 31초

반대로 문자열로부터 날짜와 시간 정보를 읽어서 datetime.datetime 클래스 객체를 만드는 것도 가능하다. 이 때는 datetime.datetime.strptime() 클래스 메서드를 사용한다. 처음 인수로는 날짜와 시간 정보를 가진 문자열을, 두번째 인수로는 그 문자열을 해독할 수 있는 형식 문자열을 넣는다.

In:
datetime.datetime.strptime("2017-01-02 14:44", "%Y-%m-%d %H:%M")
Out:
datetime.datetime(2017, 1, 2, 14, 44)

dateutil 패키지

datetime.datetime.strptime() 클래스 메서드를 사용하는 경우에는 문자열에 맞는 형식 문자열을 사용자가 제공해야 한다. 그러나 dateutil 패키지의 parse 명령을 쓰면 자동으로 형식 문자열을 찾아 datetime.datetime 클래스 객체를 만들어 준다.

In:
from dateutil.parser import parse
In:
parse('2016-04-16')
Out:
datetime.datetime(2016, 4, 16, 0, 0)
In:
parse("Apr 16, 2016 04:05:32 PM")
Out:
datetime.datetime(2016, 4, 16, 16, 5, 32)

다만 월과 일이 모두 12보다 작은 숫자인 경우에는 먼저 나오는 숫자를 월로 나중에 나오는 숫자를 일로 판단한다.

In:
parse('6/7/2016')
Out:
datetime.datetime(2016, 6, 7, 0, 0)

timedelta 클래스와 날짜/시간 연산

날짜나 시간의 간격을 구할 때는 두 개의 datetime.datetime 클래스 객체의 차이를 구한다. 이 결과는 datetime.timedelta 클래스 객체로 반환된다.

In:
dt1 = datetime.datetime(2016, 2, 19, 14)
dt2 = datetime.datetime(2016, 1, 2, 13)
td = dt1 - dt2
td
Out:
datetime.timedelta(48, 3600)

datetime.timedelta 클래스는 다음과 같은 속성과 메서드를 가진다.

  • 속성

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

    • total_seconds(): 모든 속성을 초단위로 모아서 변환
In:
td.days, td.seconds, td.microseconds
Out:
(48, 3600, 0)
In:
td.total_seconds()
Out:
4150800.0

반대로 datetime.datetime 클래스 객체에 datetime.timedelta 클래스 객체를 더해서 새로운 시간을 구할 수도 있다.

In:
t0 = datetime.datetime(2017, 1, 1, 13)
d = datetime.timedelta(days=30, seconds=3600)
In:
t0 + d
Out:
datetime.datetime(2017, 1, 31, 14, 0)

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!