Pandas中如何基于时间点计算另一数据表前3天温度均值新增列
问题原因
- 原有代码存在语法错误:括号不匹配、列名引用错误(df2的温度列是
temp不是temperature) - 核心逻辑错误:直接对df1和df2的完整时间列做批量比较,最终计算的是所有满足时间差条件的df2温度的全局均值,因此df1所有行返回的结果都相同,没有实现按df1每行的时间单独计算对应区间均值的需求。
实现方案
前置处理
首先确保两个DataFrame的时间列转换为datetime格式,且df2按时间排序:
import pandas as pd from datetime import timedelta # 统一转换时间格式 df1['time'] = pd.to_datetime(df1['time']) df2['time'] = pd.to_datetime(df2['time']) # df2必须按时间升序排序,后续匹配操作才能正常执行 df2 = df2.sort_values('time').reset_index(drop=True)
方案1:apply逐行计算(适合小数据量,易理解)
逐行读取df1的时间,筛选df2中对应时间区间的温度计算均值:
def calc_3d_mean(current_time): # 筛选区间:[当前时间往前3天, 当前时间),即不包含当前时间点本身 time_mask = (df2['time'] >= current_time - timedelta(days=3)) & (df2['time'] < current_time) return df2.loc[time_mask, 'temp'].mean() df1['mean_temp'] = df1['time'].apply(calc_3d_mean)
方案2:滑动窗口+merge_asof(适合大数据量,性能更高)
针对df2数据量很大的场景,用pandas内置的时间滑动窗口和模糊匹配方法,执行效率远高于逐行遍历:
# 给df2设置时间索引,计算3天滑动窗口的温度均值,closed='left'对应左闭右开区间 df2 = df2.set_index('time') df2['3d_avg_temp'] = df2['temp'].rolling(window='3D', closed='left').mean() df2 = df2.reset_index() # 用merge_asof将df2的滑动均值匹配到df1的对应时间点上 df1 = pd.merge_asof( df1.sort_values('time'), df2[['time', '3d_avg_temp']], on='time', direction='backward' ).rename(columns={'3d_avg_temp': 'mean_temp'})
补充说明
如果df1某行的时间往前3天内没有对应的df2温度数据,计算结果会返回NaN,可根据需求用fillna()方法填充默认值。
内容的提问来源于stack exchange,提问作者Florian Röhrig
相关产品推荐
相关产品推荐

