본문으로 건너뛰기
김신건의 로그

[Pandas] resample

· 수정 · 📖 약 1분 · 280자/단어 #python #pandas #datetime #resample #time-series
Pandas resample, DataFrame.resample, 시계열 집계

정의

resample(rule) 는 시계열 데이터를 다른 빈도 (월별, 일별, 시간별 등) 로 재샘플링하면서 집계한다. Pandas groupby 의 시계열 버전.

DatetimeIndex (또는 on= 으로 datetime 컬럼) 이 필수.

시각화

기본

df.resample('D').sum()        # 일별 합
df.resample('W').mean()        # 주별 평균
df.resample('ME').sum()        # 월말 (Month End)
df.resample('h').mean()        # 시간별 평균
python
import pandas as pd
import numpy as np
idx = pd.date_range('2024-01-01', periods=10, freq='D')
df = pd.DataFrame({'sales': [10,15,12,18,20,25,22,30,28,35]}, index=idx)
print(df.resample('3D').sum())
결과
            sales
2024-01-01     37
2024-01-04     63
2024-01-07     80
2024-01-10     35
date3-day sum
2024-01-0137 (10+15+12)
2024-01-0463 (18+20+25)
2024-01-0780 (22+30+28)
2024-01-1035

빈도 (frequency) 문법

코드의미
s, min, h초, 분, 시간
D
W주 (일요일 끝)
W-MON주 (월요일 끝)
ME월말 (pandas 2.x, 이전엔 ‘M’)
MS월초
QE, QS분기 말/초
YE, YS연 말/초
B영업일 (Business day)
BME영업월말

IMPORTANT

pandas 2.x 에서 'M', 'Q', 'Y' 가 deprecated. 명시적으로 'ME', 'QE', 'YE' 사용.

upsampling (간격 축소 + interpolate)

df.resample('h').ffill()              # 시간별 → 분 단위 forward fill
df.resample('h').interpolate()        # 선형 보간

downsampling (집계 함수)

df.resample('W').agg({
    'sales': ['sum', 'mean'],
    'orders': 'count',
})

label / closed

df.resample('W', closed='right', label='right')
# 'right' 라벨: 주의 마지막 날 (일요일) 이 결과 index
# 'left' 라벨: 주의 첫 날
  • closed: 구간의 닫힌 쪽 (포함 여부)
  • label: 결과 index 의 위치

origin (시작 기준)

df.resample('5min', origin='start_day')
# 매일 0시부터 5분 단위

자주 쓰는 패턴

일별 → 월별 매출

monthly = df.resample('ME', on='date')['amount'].sum()

분 단위 → 시간 단위 평균

hourly = df.resample('h').mean()

영업일 기준 (주말 제외)

df.resample('B').agg({'price': 'last'})

asfreq vs resample

# asfreq: 단순 재인덱싱, 집계 없음
df.asfreq('h', fill_value=0)

# resample: 집계 동반
df.resample('h').sum()

함정

1. DatetimeIndex 필수

df.resample('D')   # TypeError if not DatetimeIndex
df.resample('D', on='date')   # 특정 datetime 컬럼 사용

2. NaN 발생

# 데이터가 없는 기간은 NaN
df.resample('h').sum()
# 일부 시간은 0 이 아닌 NaN (구분: 데이터가 없음 vs 합이 0)

fill_value=0 또는 .fillna(0).

3. timezone 영향

# tz-aware index 에서 'D' 는 자정 기준 (해당 timezone 의)
df.tz_convert('UTC').resample('D').sum()

참고

이 글의 용어 (5개)
[Pandas] .dt accessorpandas
정의 는 datetime Series 의 각 구성요소 (년/월/일/시/분/요일 등) 에 벡터로 접근하는 accessor. 의 datetime 버전. 기본 컴포넌트 | 속성 | 의…
[Pandas] date_range / Timestamppandas
정의 - : 정해진 시작/끝/간격으로 datetime 시퀀스 생성 - : pandas 의 단일 datetime 객체 - : 시간 차이 daterange , , , 중 3 개 만 …
[Pandas] groupbypandas
정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
[Pandas] rolling / expandingpandas
정의 - : 고정 크기 슬라이딩 윈도우 (이동 평균 등) - : 시작부터 누적 윈도우 (cumulative) - : 지수 가중 이동 평균 시각화 rolling 기본 <CodeWi…
[Pandas] to_datetimepandas
정의 는 문자열/숫자를 datetime 으로 변환. pandas 의 시계열 작업의 시작. 기본 <CodeWithOutput language="python" outputLangua…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기