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

[Pandas] resample

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

정의

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

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

사용 상황

상황resample 활용
일별 데이터를 월별로 집계resample('ME').sum()
분 단위 로그를 시간 단위로 평균resample('h').mean()
누락 기간 채우기 (upsampling)resample('D').ffill()
OHLCV (주식 캔들스틱)resample('D').agg({'open','close','high','low','vol'})
영업일 기준 집계resample('B').last()
분기별 보고서resample('QE').sum()

시각화

downsampling vs upsampling 개념:

flowchart LR
    Src["원본 시계열"] --> Down["Downsampling"]
    Src --> Up["Upsampling"]
    Down --> D1["간격 넓힘 + 집계: 분 단위 -> 시간 단위"]
    D1 --> D2["sum, mean, last 등 집계 함수 선택"]
    Up --> U1["간격 좁힘 + 보간: 일별 -> 시간별"]
    U1 --> U2["ffill, bfill, interpolate 등으로 채움"]

resample 처리 파이프라인:

flowchart TD
    Input["DatetimeIndex DataFrame"] --> R["resample(rule)"]
    R --> Bucket["시간 버킷 분류"]
    Bucket --> Agg["집계 함수 적용"]
    Agg --> Idx["새 DatetimeIndex 생성"]
    Idx --> Out["결과 DataFrame"]

기본

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()

resample vs groupby

항목resamplegroupby
기준시간 간격임의 키
indexDatetimeIndex 필수어떤 컬럼도 가능
빈도 문자열'D', 'ME', 'h'없음
upsampling가능 (ffill, interpolate)불가
사용 예일별 -> 월별 집계카테고리별 집계
# 동일 결과 (downsampling 에서는 groupby 도 가능)
df.resample('ME').sum()
df.groupby(df.index.to_period('M')).sum()  # 더 복잡

OHLCV 패턴

주식 / 가격 데이터에서 자주 쓰는 패턴:

ohlcv = df['price'].resample('D').agg(
    open='first',
    high='max',
    low='min',
    close='last',
)
volume = df['volume'].resample('D').sum()
candle = ohlcv.join(volume)

함정

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()

4. pandas 2.x 빈도 문자열 변경

# 1.x 에서는 동작했지만 2.x 에서 deprecated
df.resample('M').sum()    # FutureWarning
df.resample('Q').sum()    # FutureWarning

# 올바른 표기
df.resample('ME').sum()   # Month End
df.resample('QE').sum()   # Quarter End

IMPORTANT

pandas 2.2 이후 'M', 'Q', 'Y' 는 deprecated. 'ME', 'QE', 'YE' 로 대체.

5. label / closed 혼동

# 기본: label='left', closed='left'
df.resample('W').sum()
# 결과 index 는 주의 시작 날짜 (월요일)

df.resample('W', label='right').sum()
# 결과 index 는 주의 마지막 날짜 (일요일)

합계 자체는 동일하나 index 라벨이 다름. 시각화 시 주의.

관련 위키

이 글의 용어 (6개)
[Pandas] .dt accessorpandas
정의 는 datetime Series 의 각 구성요소 (년/월/일/시/분/요일 등) 에 벡터로 접근하는 accessor. 의 datetime 버전. 구성요소 분류 시각화 기본 컴…
[Pandas] date_range / Timestamppandas
정의 - : 정해진 시작/끝/간격으로 datetime 시퀀스 생성 - : pandas 의 단일 datetime 객체 - : 시간 차이 사용 상황 | 상황 | 사용 API | |:…
[Pandas] groupbypandas
정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
[Pandas] interpolatepandas
정의 는 NaN 을 주변 값을 사용해 보간 으로 채운다. 시계열, 센서 측정 데이터처럼 값이 연속적으로 변화하는 경우의 결측을 자연스럽게 채울 때 유용하다. 가 단일 고정값이나 …
[Pandas] rolling / expandingpandas
정의 - : 고정 크기 슬라이딩 윈도우 (이동 평균 등) - : 시작부터 누적 윈도우 (cumulative) - : 지수 가중 이동 평균 사용 상황 | 상황 | 적합한 방법 | …
[Pandas] to_datetimepandas
정의 는 문자열, 정수, dict, DataFrame 컬럼을 타입으로 변환한다. pandas 시계열 작업의 출발점. 사용 상황 - CSV 로드 후 날짜 컬럼이 (문자열) 로 읽혔…

💬 댓글

사이트 검색 / 명령어

검색

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