[파이썬] time 모듈로 시간 데이터 다루기
Nov 30, 2019 · 6 min read



간단한 시간 데이터를 처리하기 위해서 사용되는 파이썬의 내장 모듈인 time에 대해서 알아보도록 하겠습니다.

Epoch Time

파이썬의 time 내장 모듈은 주로 epoch time(Unix time, POSIX time)을 다룰 때 사용합니다. epoch time은 UTC(GMT+0) 기준으로 1970년 1월 1일 0시 0분 0초부터의 경과 시간을 나타내는데 흔히 timestamp라고 불리기도 합니다.

인간이 사용하는 사용하는 날짜와 시간에는 시간대(time zone), 일괄절약타임(date light saving), 윤년/윤달, 양력/음력 등 여러가지 복잡한 개념들이 많이 들어가 있습니다. 따라서 전산 시스템에서는 이렇게 복잡한 날짜와 시간을 모델링하는 대신에, epoch time을 이용해서 시간을 단순하게 숫자로 저장하고 처리하는 경우가 많습니다.

time_struct 클래스

컴퓨터 친화적인 Unix timestamp 값은 인간에게는 직관적이지 않습니다. 예를 들어, timestamp 1575142526.500323를 보고, 무슨 날짜와 시간을 나타내는지를 바로 알아차릴 수 있는 사람은 많지 않을 것입니다.

따라서, time 모듈은 timestamp가 주어졌을 때, 날짜와 시간을 알아내기 위한 API를 제공하는데요. 이를 위해 time 모듈은 내부적으로 날짜와 시간을 표현하기 위해서 9개의 속성를 갖는 time_struct 클래스를 사용합니다.

이름 비고
tm_year 예: 1993, 2019
tm_mon 범위: 1~12
tm_mday 범위: 1~31
tm_hour 범위: 0~23
tm_min 범위: 0~59
tm_sec 범위: 0~61
tm_wday 요일 범위: 0~6 (0: 월요일)
tm_yday 연중 경과일 범위: 1~366
tm_isdst 일광절약타임 적용여부 0: 미적용 1: 적용 -1: 모름

time() 함수: 현재 timestamp 얻기

time 모듈의 time() 함수는 현재 Unix timestamp을 소수로 리턴하는데요. 정수부는 초단위이고, 소수부는 마이크로(micro) 초단위 입니다.

import time

secs = time.time()
print(secs)
  • 출력 결과
1575142526.500323

타임 머신을 타고 과거로 가지 않는 이상 매번 호출할 때 마다 더 큰 수가 리턴이 되겠죠?

gmtime(), localtime() 함수: timestamp를 time_struct 타입으로 변환

gmtime() 함수는 주어진 timestamp 값을 GMT 기준의 time_struct 타입 데이터로 변환해줍니다.

import time

tm = time.gmtime(1575142526.500323)
print(tm)
  • 출력 결과
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=30, tm_hour=19, tm_min=35, tm_sec=26, tm_wday=5, tm_yday=334, tm_isdst=0)

localtime() 함수는 주어진 timestamp 값을 현지 시간대 기준의 time_struct 타입 데이터로 변환해줍니다.

import time

tm = time.localtime(1575142526.500323)
print("year:", tm.tm_year)
print("month:", tm.tm_mon)
print("day:", tm.tm_mday)
print("hour:", tm.tm_hour)
print("minute:", tm.tm_min)
print("second:", tm.tm_sec)
  • 출력 결과
year: 2019
month: 11
day: 30
hour: 14
minute: 35
second: 26

저는 현재 북미의 동부 표준 시간대(EST, GMT-5)에서 이 포스트를 작성하고 있기 때문에, 위의 GMT 기준 19시보다 5시간 느린 14시로 변환된 것을 알 수 있습니다.

참고로 gmtime()localtime() 함수 모두 timestamp를 넘기지 않고 호출하면, 현재 시간을 time_struct으로 변환을 해줍니다.

time.gmtime() ## time.gmtime(time.time()) 와 동일
time.localtime() ## time.localtime(time.time()) 와 동일

ctime(): timestamp를 문자열로 변환

ctime() 함수는 주어진 timestamp를 현지 시간대 기준으로 소위 미국에서 흔히 사용되는 요 월 일 시:분:초 년 포멧으로 변환해줍니다. 그냥 간단하게 timestamp가 나타내는 날짜와 시간을 확인해보는 용도로 쓰기에 좋습니다.

import time

string = time.ctime(1575142526.500323)
print(string)
  • 출력 결과
Sat Nov 30 14:35:26 2019

strftime(): time_struct 타입 데이터를 특정 포멧의 문자열로 변환

strftime() 함수는 ctime() 함수처럼 정해진 포멧인 아닌 다양한 포멧의 문자열 변환이 가능하게 해줍니다. 첫번째 인자로 포멧을 넘겨야 하는데, 포멧 규칙은 파이썬 공식 레펀러스를 참고 바랍니다. 두번째 인자로는 timestamp가 아닌 time_struct 타입 데이터를 받으므로 주의해야 합니다. 위에서 다룬 gmttime()이나 localtime() 같은 함수를 사용해서 time_struct 타입 데이터를 확보 후에 strftime() 함수의 두번째 인자로 넘기면 됩니다.

strftime() 함수를 이용해서 한국에서 자주 쓰이는 날짜/시간 포멧의 문자열로 변환을 해보겠습니다.

import time

tm = time.localtime(1575142526.500323)
string = time.strftime('%Y-%m-%d %I:%M:%S %p', tm)
print(string)
  • 출력 결과
2019-11-30 02:35:26 PM

strptime(): 특정 포멧의 문자열을 time_struct 타입 데이터로 변환

strptime() 함수는 strftime() 함수와 정반대로 특정 포멧의 문자열을 time_struct 타입으로 변환을 해줍니다.

import time

string = '2019-11-30 02:35:26 PM'
tm = time.strptime(string, '%Y-%m-%d %I:%M:%S %p')
print(tm)
  • 출력 결과
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=30, tm_hour=14, tm_min=35, tm_sec=26, tm_wday=5, tm_yday=334, tm_isdst=-1)

sleep(): 일정 시간동안 실행 지연 시키기

sleep() 함수는 프로그램의 실행을 일정 시간동안 지연시키고 싶을 때 사용됩니다. 지연시키고 싶은 시간을 초단위로 넘기면, 그 시간동안 프로그램의 실행이 멈췄다가 다시 실행됩니다.

import time

print("before")
time.sleep(1.5)
print("after")

[응용] 프로그램 수행 시간 측정

time 내장 모듈을 사용하면 간단하게 프로그램의 특정 구간의 수행 시간을 측정해볼 수 있습니다.

import time

start = time.time()
time.sleep(1.5)
end = time.time()
print('time elapsed:', end - start)
  • 출력 결과
time elapsed: 1.5007548332214355

마치면서

이상으로 파이썬의 time 모듈을 사용해서 간단한 시간 데이터를 다루는 방법에 대해서 살펴보았습니다. 파이썬은 좀 더 복잡한 날짜와 시간 처리를 위해서 datetimecalendar 내장모듈도 지원하고 있습니다. 이 2개의 모듈에 대해서는 추후 기회가 되면 다뤄보도록 하겠습니다.

참고






Engineering Blog  by Dale Seo