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

使用Pandas按最近日期时间合并两个DataFrame的问题求解

Pandas 按最近时间关联两个DataFrame解决方案

原有代码的核心问题是搞反了关联的主从表:你当前的逻辑是「给每个位置匹配最近的事件」,而你的需求是「给每个事件匹配最近的位置」,所以才会出现事件缺失、单事件被多位置匹配的问题。

你可以用pandas专门处理时间临近匹配的merge_asof方法实现需求,修改后的代码如下:

import pandas as pd

# 读取和预处理数据逻辑保持不变
df1 = pd.read_csv("path/filename1.csv")
df2 = pd.read_csv("path/filename2.csv")

df1['DateTime'] = pd.to_datetime(df1.DateTime)
df2['DateTime'] = pd.to_datetime(df2.DateTime)

# merge_asof要求关联键必须排序,这步也保持不变
df1.sort_values('DateTime', inplace=True)
df2.sort_values('DateTime', inplace=True)

# 核心修改:用merge_asof做临近匹配,左表为事件表df1,保证输出行数和df1一致
result = pd.merge_asof(
    left=df1, 
    right=df2, 
    on='DateTime', 
    direction='nearest', # 匹配最近的时间,也可以根据需求改成backward/forward
    suffixes=('_event', '_location') # 处理两个表都有ID字段的重名问题
)

result.to_csv("path/filename_join.csv", index=False)

方案说明

  • merge_asof会为左表的每一行,在右表中找on指定字段值最接近的行匹配,左表是事件表df1,因此输出结果固定为11行,完全覆盖所有事件
  • 允许多个左表行匹配同一个右表行,符合「一个位置可匹配多个事件」的要求
  • 右表中没有被匹配到的位置不会出现在结果中,符合「部分位置可无匹配事件」的要求

如果需要限制时间匹配的最大间隔,比如只匹配1小时以内的最近位置,可以加tolerance参数:

result = pd.merge_asof(
    left=df1, 
    right=df2, 
    on='DateTime', 
    direction='nearest',
    suffixes=('_event', '_location'),
    tolerance=pd.Timedelta(hours=1) # 可自定义时间间隔
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:10