You need to enable JavaScript to run this app. Pandas:如何按最大5天日期容差规则对齐两个时间序列?
优惠活动
大模型
产品
解决方案
定价
更多

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"])
)

匹配逻辑实现

两种等价实现,均可完全覆盖规则要求:

  1. 简洁重索引方案(单字段匹配优先选这个)
    直接调用reindex的内置最近邻匹配能力,代码量最少:
    C = B.reindex(
        index=A.index,
        method="nearest",
        tolerance=pd.Timedelta(days=5)
    )
    
  2. 合并匹配方案(多字段扩展场景适用)
    利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 06:54:01