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

