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

Pandas实现非均匀时间戳下未来5秒移动平均值计算

高效计算非均匀时间序列的未来5秒移动平均值

针对非均匀时间戳的DataFrame,要高效计算每个时间点未来5秒(不含当前)的Price均值,我们可以用向量化操作+累计求和的方案,彻底避免低效的apply循环,时间复杂度仅为O(n log n),适合处理大规模数据。

步骤详解

首先确保你的Timestamp列是datetime类型并设置为索引(如果还没做的话):

import pandas as pd
import numpy as np

# 转换Timestamp为datetime类型并设为索引
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
df = df.set_index('Timestamp')

1. 转换时间戳为数值格式

把时间戳转换成unix秒级数值,方便后续的区间匹配:

# 将Timestamp转为unix时间戳(单位:秒)
ts = df.index.view('int64') // 10**9
# 计算每个时间点的未来5秒结束时间
end_ts = ts + 5

2. 快速定位每个时间点的区间边界

用numpy.searchsorted找到每个时间点对应的未来5秒区间的右边界,同时左边界是当前行的下一行(排除当前数据):

# 找到第一个大于end_ts的索引(区间右边界)
right_idx = ts.searchsorted(end_ts, side='right')
# 左边界为当前索引+1(跳过当前行)
left_idx = np.arange(len(df)) + 1

3. 用累计求和计算区间均值

利用累计求和(cumsum)可以快速计算任意区间的总和与数量,进而得到均值:

# 计算Price的累计和
cum_sum = df['Price'].cumsum()
# 计算累计行数(从1开始计数)
cum_count = np.arange(1, len(df)+1)

# 初始化结果数组,默认值为NaN(无未来数据时)
future_avg = np.full(len(df), np.nan)
# 筛选出有有效未来数据的行(左边界 < 右边界)
mask = left_idx < right_idx

# 计算有效区间的均值:(区间总和) / (区间行数)
future_avg[mask] = (
    cum_sum.iloc[right_idx[mask]-1] - cum_sum.iloc[left_idx[mask]-1]
) / (
    cum_count[right_idx[mask]-1] - cum_count[left_idx[mask]-1]
)

# 将结果添加到原DataFrame
df['Future_5s_Avg'] = future_avg

验证你的示例数据

以你提供的索引5(Timestamp: 2019-01-02 08:30:05)为例:

  • 未来5秒结束时间是08:30:10
  • 右边界索引是9(第一个超过08:30:10的时间点是索引9的08:30:11)
  • 左边界是6(跳过当前行)
  • 区间覆盖索引6、7、8,Price分别为56.540、56.550、56.545,均值为(56.540+56.550+56.545)/3 = 56.545,和你预期的结果完全一致。

为什么这个方案高效?

  • 所有操作都是向量化的,没有逐行循环,避免了apply方法的O(n²)时间复杂度
  • searchsorted的时间复杂度是O(n log n),累计求和是O(n),整体性能远高于循环方案
  • 适合处理百万级甚至更大规模的时间序列数据

内容的提问来源于stack exchange,提问作者NoraTheFlora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:45:46