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

