Pandas:如何按最大5天日期容差规则对齐两个时间序列?
Pandas 带日期容差的非对齐时间序列匹配实现
核心匹配规则
最终输出序列C完全保留A的全部日期作为索引,对每个A的日期按固定优先级匹配B的数值:
- 优先匹配B中与A日期完全一致的记录
- 无完全匹配项时,从与A日期差1天、2天…的B记录中选择距离最近的可匹配项
- 最大允许日期差为5天,超出范围的匹配项直接留空为NaN
代码实现
前置准备
统一将两个序列的索引转换为datetime格式,避免类型不匹配导致的匹配失效:
import pandas as pd # 模拟示例序列A A = pd.Series( data=[10, 20, 30, 40, 50], index=pd.to_datetime(["2020-01-01", "2020-01-03", "2020-01-10", "2020-01-15", "2020-01-20"]) ) # 模拟示例序列B B = pd.Series( data=[100, 200, 300, 400], index=pd.to_datetime(["2020-01-02", "2020-01-03", "2020-01-12", "2020-01-25"]) )
匹配逻辑实现
两种等价实现,均可完全覆盖规则要求:
- 简洁重索引方案(单字段匹配优先选这个)
直接调用reindex的内置最近邻匹配能力,代码量最少:C = B.reindex( index=A.index, method="nearest", tolerance=pd.Timedelta(days=5) ) - 合并匹配方案(多字段扩展场景适用)
利用merge_asof的邻接匹配能力,适合需要同时保留A、B多列字段的场景:# 需提前对两个序列的日期索引做升序排序,否则会触发运行报错 A_sorted = A.sort_index() B_sorted = B.sort_index() C = pd.merge_asof( left=A_sorted.rename("A值"), right=B_sorted.rename("匹配B值"), left_index=True, right_index=True, direction="nearest", tolerance=pd.Timedelta(days=5) )["匹配B值"]
关键说明
- 两种实现的匹配优先级天然符合需求逻辑:日期差为0(完全一致)的记录距离最近,会被最先选中;其次是差1天、差2天的记录,直到达到5天的容差上限,无需手动逐层遍历搜索
- 当存在多个B记录与A的日期差完全相等(比如A为2020-01-03,B同时有2020-01-02和2020-01-04两条差1天的记录),工具默认优先选择日期更晚的B记录;如果需要固定选择更早的匹配项,可在匹配前对B的索引做倒序调整,无需额外写判断逻辑
- 示例场景下A的2020-01-01记录,匹配到B中2020-01-02的值,完全符合规则描述的样例逻辑
内容的提问来源于stack exchange,提问作者saei
相关产品推荐
相关产品推荐

