[Pandas] merge_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…
💬 댓글