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

如何基于2分钟滚动时间窗口值为Pandas DataFrame创建新列

问题:基于时间滚动窗口判断DataFrame中是否存在指定值

原始数据

首先构建带有时间索引的DataFrame:

import pandas as pd

df = pd.DataFrame({
    "date": pd.date_range(start="2010-01-01 12:00", end="2010-01-01 12:05", freq="T"),
    "values": [1, 0, 0, 0, 1, 0]
}).set_index("date")

原始数据展示:

values
date                       
2010-01-01 12:00:00       1
2010-01-01 12:01:00       0
2010-01-01 12:02:00       0
2010-01-01 12:03:00       0
2010-01-01 12:04:00       1
2010-01-01 12:05:00       0

需求

在2分钟的滚动时间窗口内,判断窗口中是否存在值1:

  • 存在则返回True
  • 不存在则返回False

预期结果:

values
date                       
2010-01-01 12:00:00    True  # 窗口包含[1, 0],存在1
2010-01-01 12:01:00   False  # 窗口包含[0, 0],无1
2010-01-01 12:02:00   False
2010-01-01 12:03:00    True
2010-01-01 12:04:00    True

解决方案

不需要使用groupby,直接利用Pandas的滚动时间窗口功能即可实现,有两种高效方式:

方法1:利用窗口求和判断

由于values列只有0和1,窗口内只要有1,求和结果就会大于0,这种方式性能最优:

# 生成结果列
df['result'] = df['values'].rolling('2T').sum() > 0

# 提取预期的前5行结果
print(df['result'].iloc[:5])

输出:

date
2010-01-01 12:00:00     True
2010-01-01 12:01:00    False
2010-01-01 12:02:00    False
2010-01-01 12:03:00     True
2010-01-01 12:04:00     True
Name: result, dtype: bool

方法2:使用apply判断是否存在1

如果需要更通用的判断(比如值不是0/1的情况),可以用apply结合any():

df['result'] = df['values'].rolling('2T').apply(lambda x: (x == 1).any()).astype(bool)

print(df['result'].iloc[:5])

输出和方法1完全一致。

关键说明

  • rolling('2T'):创建长度为2分钟的滚动时间窗口,窗口范围为当前时间往前推2分钟(包含当前时间点)
  • 方法1利用向量化求和操作,比方法2的lambda更高效,适合处理大规模数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:53:21