Pandas合并两个DataFrame时如何向前查找匹配时间戳对应数据
方案1:使用merge_asof实现近似时间匹配(对应你提到的「向前查找匹配记录」思路)
pd.merge_asof是Pandas专门设计用于有序键近似匹配的工具,完全匹配你的需求,代码简洁执行效率高:
import pandas as pd # 你的原始数据 df = pd.DataFrame( {'ID': [1000, 1000, 1002, 1003, 1004], 'Start Date': [ pd.Timestamp('2021-01-01'), pd.Timestamp('2021-01-01'), pd.Timestamp('2021-04-01'), pd.Timestamp('2021-01-01'), pd.Timestamp('2021-01-01') ], 'Name': ['Joe', 'Bill', 'Bill', 'Martin', 'Jane'] } ) df2 = pd.DataFrame( {'ID': [1000, 1002, 1002, 1003, 1004], 'Start Date': [ pd.Timestamp('2021-01-01'), pd.Timestamp('2021-01-01'), pd.Timestamp('2021-04-05'), pd.Timestamp('2021-01-01'), pd.Timestamp('2021-01-10') ], 'Position': ['Operator', 'Operator', 'Manager', 'Operator', 'Operator']}) # 必须先对两个表按ID和Start Date排序,merge_asof要求匹配的时间列有序 df_sorted = df.sort_values(['ID', 'Start Date']) df2_sorted = df2.sort_values(['ID', 'Start Date']) # 执行近似匹配 # direction参数说明: # - forward:匹配df2中大于等于df当前Start Date的第一个记录 # - backward:匹配df2中小于等于df当前Start Date的最后一个记录(和补全日期前向填充的效果一致) result = pd.merge_asof( df_sorted, df2_sorted, on='Start Date', by='ID', direction='forward' # 根据你的实际匹配逻辑调整即可 ) print(result)
方案2:补全df2的日期后常规合并(对应你提到的「补全第二张DataFrame数据」思路)
如果后续需要用到全量日期做其他计算,可以先补全df2每个ID的所有日期记录,再做普通合并:
# 确定需要覆盖的全量日期范围 min_date = min(df['Start Date'].min(), df2['Start Date'].min()) max_date = max(df['Start Date'].max(), df2['Start Date'].max()) all_dates = pd.date_range(start=min_date, end=max_date, freq='D') # 按ID分组补全所有日期,前向填充职位信息 df2_full = df2.set_index('Start Date').groupby('ID', group_keys=False).apply( lambda x: x.reindex(all_dates, method='ffill') ).reset_index(names='Start Date') # 常规合并即可得到完整结果 result = df.merge(df2_full, how='left', on=['ID', 'Start Date']) print(result)
内容的提问来源于stack exchange,提问作者Nichlas H.
相关产品推荐
相关产品推荐

