如何基于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
相关产品推荐
相关产品推荐

