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
相关产品推荐
相关产品推荐

