如何在Pandas中统计时间窗口内的事件频率?(附销售数据场景)
问题:为Pandas DataFrame添加时间窗口内的事件次数
假设我有如下Pandas DataFrame,记录了不同门店的水果销售数据:
Time_of_sale Product Store 05.01.2018 15:37 Apple 1 05.01.2018 13:58 Apple 1 05.01.2018 15:36 Banana 2 05.01.2018 15:33 Banana 3 15.08.2017 19:08 Strawberry 4 15.08.2017 19:04 Blueberry 4 03.09.2017 15:32 Pere 5 03.09.2017 15:31 Pere 6 05.01.2018 15:32 Blueberry 7 05.01.2018 15:27 Banana 2 08.01.2018 09:31 Grapes 1
我希望为每一行添加对应时间窗口内的事件发生次数,请问该如何实现?
解决方案
这个需求用Pandas的时间窗口功能就能轻松实现,我分两种常见场景给你讲解:
1. 全局时间窗口(所有门店的事件都计入)
首先得把字符串格式的时间转换成Pandas可识别的datetime类型,然后排序数据(时间窗口计算依赖有序的时间序列),最后用滚动窗口统计次数:
import pandas as pd # 先构造示例DataFrame data = { 'Time_of_sale': ['05.01.2018 15:37', '05.01.2018 13:58', '05.01.2018 15:36', '05.01.2018 15:33', '15.08.2017 19:08', '15.08.2017 19:04', '03.09.2017 15:32', '03.09.2017 15:31', '05.01.2018 15:32', '05.01.2018 15:27', '08.01.2018 09:31'], 'Product': ['Apple', 'Apple', 'Banana', 'Banana', 'Strawberry', 'Blueberry', 'Pere', 'Pere', 'Blueberry', 'Banana', 'Grapes'], 'Store': [1, 1, 2, 3, 4, 4, 5, 6, 7, 2, 1] } df = pd.DataFrame(data) # 步骤1:转换时间列格式 df['Time_of_sale'] = pd.to_datetime(df['Time_of_sale'], format='%d.%m.%Y %H:%M') # 步骤2:按时间排序(必须!否则窗口计算会出错) df = df.sort_values('Time_of_sale').reset_index(drop=True) # 步骤3:设置时间为索引,计算滚动窗口内的事件数 # 这里用1小时窗口,你可以改成'30min'、'2H'、'1D'等任意时间单位 df['global_window_count'] = df.set_index('Time_of_sale') \ .rolling(window='1H')['Product'] \ .count() \ .reset_index(drop=True)
运行后,global_window_count列就是每一行对应时间点前1小时内所有门店的销售事件次数。
2. 按门店分组的时间窗口(仅统计当前门店的事件)
如果需要统计同一门店在时间窗口内的销售次数,只需要在滚动窗口前先按门店分组:
# 基于已经转换并排序好的df df['store_window_count'] = df.groupby('Store') \ .rolling(window='1H', on='Time_of_sale')['Product'] \ .count() \ .reset_index(drop=True)
这样store_window_count列就是当前门店在对应时间点前1小时内的销售事件次数。
关键说明
- 时间窗口参数
window可以自定义,支持的单位包括:min(分钟)、H(小时)、D(天)等,比如window='30min'就是统计前30分钟的事件。 - 如果需要排除当前行本身,只统计之前的事件,可以给
rolling添加closed='left'参数(比如rolling(window='1H', closed='left'))。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

