如何使用Pandas基于时间匹配并合并两个DataFrame的燃料类型数据?
需求实现方案
问题说明
现有两个DataFrame:
import pandas as pd df2 = pd.DataFrame({ 'Date Time': ['25/10/2023 09:00:00', '25/10/2023 16:35:00', '26/10/2023 09:00:00'], 'Fuel Type': ['D1', pd.NA, 'D2'] }, index=[1,2,3]) df1 = pd.DataFrame({ 'Date Time': ['25/10/2023 09:24', '25/10/2023 13:24', '26/10/2023 09:55'], 'Test Fuel': [4196, 3465, 4566] }, index=[1,2,3])
需要给df1添加Fuel Type列,规则是:从df2匹配对应时间区间的燃料类型,未更新时默认保持上一次的类型(初始为D1),最终得到目标结果。
实现步骤
- 转换时间格式:将两个DataFrame的
Date Time列转为datetime类型,确保时间可正确排序和匹配。 - 填充空值:对
df2中空的Fuel Type值使用前向填充(ffill),延续上一个有效的燃料类型。 - 按时间匹配:使用
pandas.merge_asof()方法,按时间顺序将df1的每条记录与df2中最近的不晚于当前时间的记录匹配,获取对应燃料类型。
完整代码
import pandas as pd # 构造原始DataFrame df2 = pd.DataFrame({ 'Date Time': ['25/10/2023 09:00:00', '25/10/2023 16:35:00', '26/10/2023 09:00:00'], 'Fuel Type': ['D1', pd.NA, 'D2'] }, index=[1,2,3]) df1 = pd.DataFrame({ 'Date Time': ['25/10/2023 09:24', '25/10/2023 13:24', '26/10/2023 09:55'], 'Test Fuel': [4196, 3465, 4566] }, index=[1,2,3]) # 转换时间列为datetime类型 df2['Date Time'] = pd.to_datetime(df2['Date Time'], format='%d/%m/%Y %H:%M:%S') df1['Date Time'] = pd.to_datetime(df1['Date Time'], format='%d/%m/%Y %H:%M') # 填充df2的Fuel Type空值 df2['Fuel Type'] = df2['Fuel Type'].ffill() # 按时间排序(merge_asof要求两个DataFrame都按key列排序) df2_sorted = df2.sort_values('Date Time') df1_sorted = df1.sort_values('Date Time') # 使用merge_asof匹配 result = pd.merge_asof(df1_sorted, df2_sorted, on='Date Time', direction='backward') # 恢复原始索引顺序 result = result.loc[df1.index] print(result)
结果输出
Date Time Test Fuel Fuel Type 1 2023-10-25 09:24:00 4196 D1 2 2023-10-25 13:24:00 3465 D1 3 2023-10-26 09:55:00 4566 D2
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

