Skip to main content

시계열 데이터

시계열(Time Series) 데이터는 시간 순서로 기록된 데이터입니다. 주가, 기온, 웹 트래픽, 센서 데이터 등이 대표적입니다. Pandas는 DatetimeIndex를 중심으로 시계열 데이터를 효율적으로 다루는 기능을 제공합니다.

학습 목표

  • DatetimeIndex를 생성하고 활용할 수 있다
  • resample로 시계열 데이터의 빈도를 변환할 수 있다
  • 시간대(timezone)를 설정하고 변환할 수 있다
  • 날짜 오프셋으로 비즈니스 날짜를 계산할 수 있다

왜 중요한가

시계열 분석은 수요 예측, 재고 관리, 이상 감지 등 다양한 비즈니스 문제의 기초입니다. 시계열 ML 모델(ARIMA, Prophet, LSTM)에 데이터를 공급하려면 올바른 시간 인덱스와 적절한 리샘플링이 필수입니다.

DatetimeIndex

import pandas as pd
import numpy as np

# 날짜 범위 생성
dates = pd.date_range(start='2024-01-01', periods=365, freq='D')
df = pd.DataFrame({'date': dates, 'value': np.random.randn(365).cumsum()})
df = df.set_index('date')

# DatetimeIndex 속성
print(df.index.year.unique())     # 연도
print(df.index.month.unique())    # 월
print(df.index.dayofweek.unique()) # 요일

# 날짜 기반 슬라이싱
print(df['2024-03'])              # 2024년 3월 데이터
print(df['2024-01':'2024-03'])    # 1~3월 데이터
print(df.loc['2024-06-15'])       # 특정 날짜

resample — 빈도 변환

# 일별 → 월별 (다운샘플링)
monthly = df.resample('M').mean()
print(monthly.head())

# 일별 → 주별 (다운샘플링)
weekly = df.resample('W').agg({
    'value': ['mean', 'min', 'max', 'std']
})

# 월별 → 일별 (업샘플링)
daily = monthly.resample('D').interpolate(method='linear')
빈도 코드설명예시
D매일
W매주 일요일
M월말매월 마지막 날
MS월초매월 1일
Q분기매 분기말
Y연말매년 12월 31일
H시간매시간
T / min매분
B영업일주말 제외

시간대 처리

# 시간대 설정
df.index = df.index.tz_localize('Asia/Seoul')

# 시간대 변환
df_utc = df.tz_convert('UTC')
df_ny = df.tz_convert('US/Eastern')

# 시간대 제거
df_naive = df.tz_localize(None)

날짜 오프셋

from pandas.tseries.offsets import BDay, MonthEnd, DateOffset

date = pd.Timestamp('2024-03-15')

# 영업일 기준 이동
print(date + BDay(5))         # 5 영업일 후
print(date - BDay(3))         # 3 영업일 전

# 월말
print(date + MonthEnd(1))     # 해당 월의 마지막 날

# 커스텀 오프셋
print(date + DateOffset(months=3, days=10))

AI/ML에서의 활용

  • 시계열 피처: lag 피처, 이동평균 등을 생성하여 시계열 모델에 입력합니다
  • 학습/검증 분할: 시계열은 시간순으로 분할하여 데이터 누수를 방지합니다
  • 리샘플링: 불규칙한 시계열을 균등 간격으로 변환하여 모델에 입력합니다
  • 계절성 분석: 월별, 요일별 패턴을 피처로 활용합니다
resample()은 시간 기반 그룹화 전용이며 DatetimeIndex가 필요합니다. groupby(df.index.month)로도 비슷한 결과를 얻을 수 있지만, resample이 시계열 특화 기능(업샘플링, 보간 등)을 더 많이 지원합니다.
시계열 데이터는 반드시 시간순으로 분할해야 합니다. 무작위 분할을 사용하면 미래 데이터로 과거를 예측하는 데이터 누수(data leakage)가 발생합니다.

체크리스트

  • DatetimeIndex를 생성하고 날짜 기반 슬라이싱을 할 수 있다
  • resample로 데이터 빈도를 변환할 수 있다
  • 주요 빈도 코드(D, W, M, Q)를 활용할 수 있다
  • 시간대를 설정하고 변환할 수 있다
  • 시계열 데이터의 학습/검증 분할 시 주의사항을 이해한다

다음 문서