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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:51:00