본문 바로가기

Study/ETC

[TIL] 데이터 분석 시 고려해야할 시간 데이터와 타임존

목차
1. 개요
2. 초 단위 VS 밀리초 Timestamp
3. 밀리초를 datetime 타입으로 변환하는 방법
4. 표준 시간대 종류 및 정의
5. 타임존 확인 & 명시

1. 개요

최근에 사이드 프로젝트를 진행하게 되었다. 입사를 한 시점부터 사이드 프로젝트를 진행해야지하고 마음 먹고 있었는데 드디어..! 글또와 데이터리안의 콜라보로 만난 분과 함께 지난주부터 본격적으로 시작해서 EDA부터 차근차근 진행 중이다. 

서로 EDA한 결과물에 대해 이야기를 나누다 시간대별 이벤트 수가 서로 다르게 기록된 것을 발견했다. 이미 그 전 회의할 때 datetime 속성에 대한 이야기를 한번했던터라 서로 전처리 한 방식부터 다시 이야기했다. 그러다가 발견한건 시간 데이터와 관련된 내용이었다. UTC와 KST로 시간대의 변환 여부에 따라 시간대가 다르게 집계되었던 것. 나 역시 혹시 몰라 진행했던 내용이고 아직까지 개념이 정확하게 정립되지 않아 다시 내용을 정리해보려한다.


2. 초 단위 VS 밀리초 Timestamp

  • 초 단위의 타임스탬프 : 일반적으로 10자리 숫자
  • 밀리초 단위의 타임스탬프 : 13자리 숫자
    • 밀리초(milliseconds, ms) : 1초의 1/1000, 1초를 1000등분한 시간 단위
    • 1초 = 1000밀리초(ms)
    • 1밀리초(ms) = 1/1000초 = 0.001초

3. 밀리초를 datetime 타입으로 변환하는 방법

1. 'datetime.fromtimestamp' 사용

datetime.fromtimestamp() 는 초 단위의 타임스탬프를 처리하기 때문에 밀리초를 초단위로 바꿔 준 다음 적용해야함.

from datetime import datetime

# 밀리초 단위 타임스탬프
timestamp = 1672694046911619

# 밀리초를 초 단위로 변환
timestamp_seconds = timestamp / 1000

# datetime 변환
datetime_obj = datetime.fromtimestamp(timestamp_seconds)

2. pandas 활용 - unit = 'ms

import pandas as pd

# 밀리초 단위 타임스탬프
timestamp = 1672694046911619

# pandas를 사용해 datetime 타입으로 변환
# 입력값이 밀리초(ms)임을 명시적으로 지정하여 변환
datetime_obj = pd.to_datetime(timestamp, unit='ms')

3. pandas 활용 - /1e6와 unit='s'

  • 마이크로초(µs) 또는 밀리초(ms) 모두 처리 가능
  • 1e6은 10^6을 의미하며, 입력값이 마이크로초(µs) 단위로 주어진 경우 이를 초 단위로 변환
import pandas as pd

# 밀리초 단위로 변환
df['event_datetime'] = pd.to_datetime(df['event_timestamp'] / 1e6, unit='s')

4. 표준 시간대 종류 및 정의

  • GTM(GreenwichMeanTime(한국시간:GMT+9))
  • UTC(UniversalTimeCoordinated(한국시간:UTC+9))
    • 좀 더 정확하고 널리 사용되는 표준이며, 국제적인 표준시간
    • 협정 세계시
    • UTC+9 : 한국 표준시(Korea Standard Time)

5. 타임존 확인 & 명시

  • python의 datetime은 타임존 정보를 포함하지 않으며, 이를 명시적으로 추가하지 않으면 시간 계산이나 표시가 예상과 다를 수 있음.
  • datetime.fromtimestamp()는 로컬 타임존(컴퓨터의 현재 설정된 시간대)를 기준으로 변경
  • datetime 객체의 tzinfo() 속성을 사용해 타임존 정보 포함 여부 확인
# 확인
print("naive_datetime")
print("tzinfo:", naive_datetime.tzinfo)  # 출력: None (타임존 정보 없음)

print("aware_datetime")
print("tzinfo:", aware_datetime.tzinfo)  # 출력: UTC (타임존 정보 있음)
  • tz_localize : 타임존이 없는(Naive) 데이터에 타임존을 추가
  • tz_convert : 이미 타임존이 있는 데이터를 다른 타임존으로 변환
# 타임존을 UTC로 지정하기
df['event_datetime'] = df['event_datetime'].dt.tz_localize('UTC')
print(df['event_datetime'].dtype) # -> UTC 활용함을 확인, datetime64[ns, UTC]

# KST로 변경
# 기존 시간 값을 해당 타임존 기준으로 변경
# ex. 2023-01-01 00:00:00+00:00 (UTC) → 2023-01-01 09:00:00+09:00 (KST).
df['event_datetime'] = df['event_datetime'].dt.tz_convert('Asia/Seoul')

print(df['event_datetime'].dtype), datetime64[ns, Asia/Seoul]

\출처 : Time and date