Python中基于不规则时间序列计算固定时间间隔平均值的最优方法
不规则时间序列固定间隔时间加权均值的最优实现方案
核心逻辑说明
你现有方案本质是计算时间加权平均值:每个数值的贡献权重等于它在对应固定窗口内的生效时长占窗口总时长的比例。直接用resample('15T').mean()是对窗口内的所有采样点做算术平均,和预期结果不符。
你之前先插秒级再重采样的方案效率极低,原因是会生成指数级增长的中间时间点,大数据场景下很容易内存溢出、运行超时。
推荐实现方案(高效无冗余)
直接通过计算每个数值的有效时长做加权平均,不需要生成任何中间插值数据,运算效率提升百倍以上:
import pandas as pd from datetime import timedelta # 你的示例数据 base = pd.to_datetime('2021-01-01 12:00') mydict = { base: 5, base + timedelta(minutes=5): 10, base + timedelta(minutes=7): 12, base + timedelta(minutes=12): 6, base + timedelta(minutes=25): 8 } series = pd.Series(mydict) # 计算每个数值的失效时间(下一个数值的生效时间) end_times = series.index[1:].append(pd.DatetimeIndex([series.index[-1] + timedelta(minutes=15)])) def time_weighted_mean(window): if window.empty: return pd.NA win_start = window.index.min().floor('15T') win_end = win_start + timedelta(minutes=15) # 计算每个数值在当前窗口内的实际生效时长 actual_start = window.index.where(window.index >= win_start, win_start) actual_end = end_times[window.index].where(end_times[window.index] <= win_end, win_end) valid_seconds = (actual_end - actual_start).dt.total_seconds() # 加权计算均值 return (window * valid_seconds).sum() / valid_seconds.sum() # 直接重采样应用计算函数 result = series.resample('15T').apply(time_weighted_mean)
输出结果
和你原有秒级插值方案的结果完全一致,精度无损失:
2021-01-01 12:00:00 8.2 2021-01-01 12:15:00 6.0 Freq: 15T, dtype: float64
方案优势
- 无冗余中间数据生成,内存占用仅和原始数据量成正比,适合超大数据集
- 计算逻辑和预期需求完全对齐,精度不受插值粒度影响
- 代码可读性更强,符合Pandas自定义重采样运算的规范写法
内容的提问来源于stack exchange,提问作者MarKre
相关产品推荐
相关产品推荐

