如何基于c_id匹配且日期差≤7天内连接两个Pandas DataFrame?
解决方案
要实现按c_id精确匹配且日期差≤7天的内连接,你需要先对同c_id的所有日期组合进行比较,再筛选符合条件的行,具体步骤如下:
步骤1:转换日期列类型
首先确保日期列是datetime类型,否则无法计算日期差:
import pandas as pd # 读取数据 df1 = pd.read_csv("my_csv1.csv") df2 = pd.read_csv("my_csv2.csv") # 转换为datetime类型 df1['dt'] = pd.to_datetime(df1['dt']) df2['r_dt'] = pd.to_datetime(df2['r_dt'])
步骤2:按c_id交叉匹配
先通过c_id将两个DataFrame做内连接,得到同一c_id下的所有日期组合:
# 按c_id合并,得到同c_id的所有日期对 merged = pd.merge(df1, df2, on='c_id', how='inner')
步骤3:计算日期差并筛选
计算dt和r_dt的日期差绝对值,筛选出≤7天的行:
# 计算日期差(天数) merged['date_diff'] = abs(merged['dt'] - merged['r_dt']).dt.days # 筛选日期差≤7的记录 filtered = merged[merged['date_diff'] <= 7]
步骤4:去重得到最终结果
由于同一df1的行可能匹配多个df2的行,需要去重保留唯一的df1记录:
# 提取需要的列并去重 result = filtered[['l_id', 'c_id', 'dt']].drop_duplicates() # 输出结果 print(result)
为什么原代码不生效?
你原来的代码同时匹配c_id和精确日期(left_on=['c_id','dt'], right_on=['c_id','r_dt']),仅保留日期完全相同的行,无法满足“日期差≤7天”的模糊匹配需求。
内容的提问来源于stack exchange,提问作者Sur
相关产品推荐
相关产品推荐

