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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:19:58