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

如何在Pandas中按组滚动统计15分钟内0的出现次数?

解决方案:基于时间窗口的滚动统计

你的问题核心是误用了固定行数的滚动窗口,而实际需要的是15分钟的时间范围窗口——因为数据的时间间隔可能不均匀,固定行数无法准确覆盖15分钟的范围。以下是可行的实现步骤:

前提准备

确保Time列是datetime类型,否则无法进行时间窗口计算:

import pandas as pd
# 转换Time列为datetime格式
df['Time'] = pd.to_datetime(df['Time'])
# 确认数据已按Group和Time排序(你已完成此步骤,可省略)
df = df.sort_values(['Group', 'Time']).reset_index(drop=True)

核心代码:按组统计15分钟内0的出现次数

使用groupby + 时间滚动窗口(rolling(window='15min')),先将Data列转换为0/1标记(等于0则为1,否则为0),再求和得到次数:

# 方法1:apply内处理
df['zero_count_15min'] = df.groupby('Group').apply(
    lambda group: group['Data'].eq(0).rolling(window='15min', on='Time').sum()
).reset_index(drop=True)

# 方法2:直接在rolling后应用统计逻辑
df['zero_count_15min'] = df.groupby('Group').rolling(window='15min', on='Time')['Data'].apply(
    lambda series: series.eq(0).sum()
).reset_index(drop=True)

关键说明

  • 时间窗口参数:window='15min'指定滚动窗口为15分钟,pandas支持的时间单位还有'h'(小时)、'D'(天)等。
  • on参数:如果Time是普通列而非索引,必须通过on='Time'指定时间基准列;若Time是索引,可省略此参数。
  • min_periods:默认值为1,即即使窗口内只有当前一条记录也会统计,符合你“含自身”的需求。

样例测试

用构造的数据验证效果:

# 构造测试数据
test_data = {
    'Group': ['A', 'A', 'A', 'A', 'B', 'B', 'B'],
    'Time': ['2024-01-01 09:00:00', '2024-01-01 09:05:00', '2024-01-01 09:14:00', '2024-01-01 09:16:00',
             '2024-01-01 09:00:00', '2024-01-01 09:10:00', '2024-01-01 09:20:00'],
    'Data': [0, 1, 0, 0, 1, 0, 0]
}
df_test = pd.DataFrame(test_data)
df_test['Time'] = pd.to_datetime(df_test['Time'])
df_test = df_test.sort_values(['Group', 'Time']).reset_index(drop=True)

# 执行统计
df_test['zero_count_15min'] = df_test.groupby('Group').apply(
    lambda g: g['Data'].eq(0).rolling(window='15min', on='Time').sum()
).reset_index(drop=True)

print(df_test)

输出结果中,Group A的第4条记录(09:16)的zero_count_15min为2——过去15分钟内(09:01-09:16)包含两条0,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:50:25