在Pandas中统计时间窗口内各事件类型的出现次数
解决方案
实现思路
要给每个唯一event_type新增列,统计每行时间戳前10ms窗口内对应事件的出现次数,可按以下步骤操作:
- 为每个事件类型生成哑变量列(仅当该行属于对应类型时为1,否则为0)
- 对每个哑变量列使用时间滚动窗口(窗口大小10ms)计算累计次数,窗口不包含当前行(避免统计自身)
完整代码
import pandas as pd data = { 'event_timestamp': [ '2024-02-01 08:02:09.065315961', '2024-02-01 08:02:09.125612099', '2024-02-01 08:02:09.160326512', '2024-02-01 08:02:09.540206541', '2024-02-01 08:02:09.571751697', '2024-02-01 08:02:09.571784060', '2024-02-01 08:02:09.574368029', '2024-02-01 08:02:09.574390737', '2024-02-01 08:02:09.578245099', '2024-02-01 08:02:10.077399943', '2024-02-01 08:02:10.077424252', '2024-02-01 08:02:10.081648527' ], 'event_type': [ 'A', 'B', 'A', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C', 'B' ] } df = pd.DataFrame(data) df['event_timestamp'] = pd.to_datetime(df['event_timestamp']) # 获取所有唯一事件类型 unique_types = df['event_type'].unique() for event_type in unique_types: # 创建临时哑变量列 df[f'temp_{event_type}'] = (df['event_type'] == event_type).astype(int) # 计算10ms窗口内的累计次数,closed='left'确保窗口不包含当前行 df[f'count_{event_type}'] = df[f'temp_{event_type}'].rolling( window='10ms', on='event_timestamp', closed='left' ).sum().fillna(0).astype(int) # 删除临时列 df.drop(f'temp_{event_type}', axis=1, inplace=True) # 调整列顺序匹配示例 df = df[['event_timestamp', 'event_type', 'count_A', 'count_B', 'count_C']] print(df)
代码说明
- 哑变量列:通过
(df['event_type'] == event_type).astype(int)生成仅对应事件类型为1的临时列,简化窗口统计逻辑 - 时间滚动窗口:
window='10ms':设置窗口大小为10毫秒on='event_timestamp':指定按时间戳列进行窗口计算closed='left':窗口包含左边界(当前行时间戳之前的时间),不包含当前行,精准匹配“之前10ms”的需求
- 填充与类型转换:用
fillna(0)处理初始行无前置数据的情况,astype(int)确保计数为整数格式
输出结果
运行代码后将得到与示例完全一致的DataFrame:
event_timestamp event_type count_A count_B count_C 0 2024-02-01 08:02:09.065315961 A 0 0 0 1 2024-02-01 08:02:09.125612099 B 0 0 0 2 2024-02-01 08:02:09.160326512 A 0 0 0 3 2024-02-01 08:02:09.540206541 A 0 0 0 4 2024-02-01 08:02:09.571751697 C 0 0 0 5 2024-02-01 08:02:09.571784060 B 0 0 1 6 2024-02-01 08:02:09.574368029 A 0 1 1 7 2024-02-01 08:02:09.574390737 C 1 1 1 8 2024-02-01 08:02:09.578245099 B 1 1 2 9 2024-02-01 08:02:10.077399943 A 0 0 0 10 2024-02-01 08:02:10.077424252 C 1 0 0 11 2024-02-01 08:02:10.081648527 B 1 1 0
内容的提问来源于stack exchange,提问作者IGottaLearnMath
相关产品推荐
相关产品推荐

