You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何按最近日期匹配合并两个DataFrame获取关联结果

实现方案

你这个需求属于时序数据的最近邻匹配合并场景,直接使用pandas内置的pd.merge_asof()方法即可实现,不需要手写循环计算日期差值,执行效率和逻辑简洁度都最优。

实现注意事项

  • 合并前必须将两个DataFrame的Date列统一转换为datetime64日期类型,不能用字符串格式存储日期
  • merge_asof要求用来匹配的日期列必须按升序排序,否则会匹配出错
  • 多分类场景下必须指定by参数,保证仅在相同Category分组内匹配最近日期,避免跨分类匹配错误
  • 要实现「找绝对日期差最小的记录」,需要将direction参数设为nearest,默认的backward参数只会匹配小于等于当前日期的最近记录,不符合当前样例需求

完整实现代码

import pandas as pd

# 构造样例数据
df1 = pd.DataFrame({
    'Category': ['A', 'A', 'A'],
    'Date': ['2022-06-01', '2022-06-10', '2022-06-20']
})
df2 = pd.DataFrame({
    'Category': ['A', 'A', 'A'],
    'Date': ['2022-06-01', '2022-06-12', '2022-06-25'],
    'Value': [100, 200, 300]
})

# 日期格式转换
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

# 按日期升序排序
df1 = df1.sort_values('Date').reset_index(drop=True)
df2 = df2.sort_values('Date').reset_index(drop=True)

# 执行最近邻合并
result = pd.merge_asof(
    left=df1,
    right=df2,
    on='Date',
    by='Category',
    direction='nearest'
)

执行后得到的result完全匹配预期输出:

Category       Date  Value
0        A 2022-06-01    100
1        A 2022-06-10    200
2        A 2022-06-20    300

参数调整说明

  • 如果业务要求仅匹配目标日期之前的最近记录,将direction改为backward即可
  • 如果业务要求仅匹配目标日期之后的最近记录,将direction改为forward即可
  • 还可以设置tolerance参数限定允许的最大日期差,超过阈值的记录不会被匹配,对应位置会返回空值

内容的提问来源于stack exchange,提问作者anewone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:33:29