如何用Pandas在指定前置滚动时间区间求execution_size最大值
问题
需要在Pandas DataFrame中,基于execution_size字段,在滚动时间区间内生成衍生指标:针对每行的timestamp,计算完全位于该行时间戳之前的前2秒至前1秒区间内execution_size的最大值。
示例数据如下:
timestamp execution_size expected_output 1 2023-10-02 07:31:42 150 NaN 2 2023-10-02 07:31:42.5 180 NaN 3 2023-10-02 07:31:43 425 150 4 2023-10-02 07:31:43.5 11 180 5 2023-10-02 07:31:44 NaN 425 6 2023-10-02 07:31:45 122 425 7 2023-10-02 07:31:45.5 NaN 11
规则说明:
- 第1、2行的前2秒至前1秒区间无数据,输出NaN;
- 第3行的目标区间仅包含第1行,取150;
- 第4行的目标区间包含第1、2行,取最大值180;
- 第5行的目标区间包含第1、2、3行,取最大值425;
- 第6行的目标区间包含第3、4、5行,取最大值425;
- 第7行的目标区间包含第4、5行,取最大值11。
此前尝试的代码不符合需求,得到的是-3s至-1s区间的结果:
rolling_max = df['execution'].rolling('3s').max().shift(periods=1, freq='1s')
解决方案
可以通过时间偏移+滚动窗口组合实现精准的区间筛选,核心思路是先给所有时间戳做偏移,再用滚动窗口限定区间范围,具体步骤如下:
- 确保
timestamp列为Pandas的时间类型:
df['timestamp'] = pd.to_datetime(df['timestamp'])
- 计算目标区间的最大值:
# 先将每行的时间戳向前偏移1秒,然后以这个偏移后的时间为基准,向前滚动1秒的窗口(即原时间的前2秒到前1秒区间) df['calculated_output'] = df.set_index('timestamp')['execution_size'] \ .shift(freq='-1s') \ .rolling(window='1s', closed='both') \ .max() \ .reset_index(drop=True)
代码解释
shift(freq='-1s'):把每个时间戳向前偏移1秒,这样后续的滚动窗口就对应原时间的前1秒位置;rolling(window='1s', closed='both'):以偏移后的时间为终点,向前取1秒的窗口,这个窗口正好对应原时间的前2秒到前1秒区间;max():计算窗口内execution_size的最大值,最后重置索引对齐原DataFrame。
验证结果
运行上述代码后,calculated_output列会和示例中的expected_output完全匹配:
calculated_output 0 NaN 1 NaN 2 150.0 3 180.0 4 425.0 5 425.0 6 11.0
内容的提问来源于stack exchange,提问作者IGottaLearnMath
相关产品推荐
相关产品推荐

