求助:如何匹配并合并含双日期列的两个DataFrame
解决DataFrame区间匹配与合并问题
我明白你需要的是基于相同other_var和name,同时日期区间存在重叠的DataFrame匹配合并,这就给你一步步拆解解决方案:
第一步:先把日期列转成datetime类型
首先得把两个DataFrame里的日期字符串转换成可比较的datetime格式,不然没法做区间判断:
import pandas as pd # 处理DataFrame A的日期列 df_a['start_date'] = pd.to_datetime(df_a['start_date']) df_a['end_date'] = pd.to_datetime(df_a['end_date']) # 处理DataFrame B的日期列 df_b['open_date'] = pd.to_datetime(df_b['open_date']) df_b['close_date'] = pd.to_datetime(df_b['close_date'])
第二步:按共同字段内连接,缩小候选范围
先把两个DataFrame按other_var和name做内连接,这样只保留这两个字段完全匹配的行,减少后续筛选的工作量:
merged = pd.merge(df_a, df_b, on=['other_var', 'name'], how='inner')
第三步:筛选日期区间重叠的行
区间重叠的核心判断逻辑是:A的起始日期 ≤ B的结束日期,且A的结束日期 ≥ B的起始日期,用这个条件过滤出符合要求的行:
df_c = merged[(merged['start_date'] <= merged['close_date']) & (merged['end_date'] >= merged['open_date'])]
第四步:调整输出列顺序(可选)
如果需要和你示例里的列顺序完全一致,可以重新排列列:
df_c = df_c[['start_date', 'end_date', 'open_date', 'close_date', 'other_var', 'name']]
验证示例数据效果
把你提供的示例数据代入上述代码,运行后就能得到你期望的df_c结果:
start_date end_date open_date close_date other_var name 0 2018-05-01 2018-05-01 2018-04-05 2018-10-01 7H companyB 1 2018-05-04 2018-05-09 2018-05-03 2018-06-01 1H companyB
关于性能的说明
你的数据集大概1000行,这种方法完全够用——先内连接再筛选的计算量很小,不会有性能瓶颈。如果后续数据量大幅增长(比如十万级以上),可以考虑用merge_asof或者区间索引优化,但目前的规模完全不需要额外调整。
内容的提问来源于stack exchange,提问作者Tony Pendleton
相关产品推荐
相关产品推荐

