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

[Pandas] merge_asof

· 수정 · 📖 약 1분 · 289자/단어 #python #pandas #merge #time-series #asof
Pandas merge_asof, as-of join, 시간 매칭 merge

정의

pd.merge_asof(left, right, on, by=, direction=)가장 가까운 키 기준 join. 일반 Pandas merge 가 정확히 일치하는 키만 매칭하는 반면, merge_asof이전 (또는 가장 가까운) 키를 찾는다.

시계열 데이터 (가격, 이벤트) 와 다른 시계열 데이터 (참조 데이터, 다른 채널) 를 매칭할 때 핵심.

기본

pd.merge_asof(left, right, on='time')
# 양쪽 모두 time 으로 정렬되어 있어야 함
# left 의 각 행에 대해, right 의 time <= left.time 중 가장 가까운 행 join

사용 예 (시계열 가격 + 거래)

python
import pandas as pd
trades = pd.DataFrame({
  'time': pd.to_datetime(['09:00:30','09:01:15','09:02:45']),
  'qty':  [100, 200, 150],
})
prices = pd.DataFrame({
  'time': pd.to_datetime(['09:00:00','09:01:00','09:02:00','09:03:00']),
  'price':[100, 101, 102, 103],
})
print(pd.merge_asof(trades, prices, on='time'))
결과
                 time  qty  price
0 2026-06-18 09:00:30  100    100
1 2026-06-18 09:01:15  200    101
2 2026-06-18 09:02:45  150    102

각 trade 시각의 직전 가격이 매칭됨.

direction

direction의미
'backward' (기본)이전 시각 매칭 (≤)
'forward'이후 시각 매칭 (≥)
'nearest'더 가까운 쪽
pd.merge_asof(trades, prices, on='time', direction='nearest')

tolerance (허용 차이)

pd.merge_asof(trades, prices, on='time', tolerance=pd.Timedelta('5min'))
# 5 분 이상 떨어지면 매칭 안 됨 (NaN)

by (그룹별 매칭)

pd.merge_asof(left, right, on='time', by='symbol')
# 같은 symbol 내에서 시간 매칭

각 종목별로 독립적 as-of join.

정렬 필수

left = left.sort_values('time')
right = right.sort_values('time')
pd.merge_asof(left, right, on='time')

정렬되지 않으면 ValueError.

자주 쓰는 패턴

가격 데이터 + 트랜잭션

# 분 단위 가격 + 초 단위 거래
trades.merge_asof(prices, on='timestamp', by='symbol')

이벤트 + 컨텍스트 데이터

events.merge_asof(user_state, on='event_time', by='user_id',
    tolerance=pd.Timedelta('1h'))

다중 시계열 통합

df = pd.merge_asof(sales, weather, on='date')
df = pd.merge_asof(df, marketing, on='date')
df = pd.merge_asof(df, holiday_calendar, on='date')

merge 와의 비교

메서드매칭 방식사용처
merge정확 일치일반 join
merge_asof가장 가까운 (시간/수치 키)시계열

함정

1. 정렬 안 되면 에러

pd.merge_asof(unsorted, sorted, on='time')   # ValueError

2. on 컬럼의 dtype

pd.merge_asof(a, b, on='date')
# date 가 한 쪽은 datetime, 다른 쪽은 str 이면 안 됨

같은 dtype 으로 통일.

3. by 의 dtype

pd.merge_asof(a, b, on='time', by='symbol')
# 양쪽 symbol 이 같은 dtype, category 권장

4. 결과의 NaN

# tolerance 밖이거나 매칭 없으면 NaN
result['price'].isna().sum()

참고

이 글의 용어 (3개)
[Pandas] mergepandas
정의 는 두 DataFrame 을 SQL join 처럼 결합. 4 가지 join 타입 (inner / left / right / outer) 지원. 시각화 4 가지 join 타입…
[Pandas] resamplepandas
정의 는 시계열 데이터를 다른 빈도 (월별, 일별, 시간별 등) 로 재샘플링하면서 집계한다. 의 시계열 버전. DatetimeIndex (또는 으로 datetime 컬럼) 이 필…
[Pandas] to_datetimepandas
정의 는 문자열/숫자를 datetime 으로 변환. pandas 의 시계열 작업의 시작. 기본 <CodeWithOutput language="python" outputLangua…

💬 댓글

사이트 검색 / 명령어

검색

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