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

如何统计当前时间前后1小时内同类别列的记录数

实现DataFrame中每条记录的同分类1小时窗口计数

步骤1:预处理时间列

首先得把time_of_day转换成pandas的datetime类型,不然没法做时间窗口计算:

import pandas as pd

# 示例输入数据
data = {
    'time_of_day': [
        '25/05/2023 11:30:00', '25/05/2023 11:30:00', '25/05/2023 11:45:00',
        '25/05/2023 12:35:00', '25/05/2023 13:00:00', '25/05/2023 13:30:00',
        '25/05/2023 13:45:00', '25/05/2023 14:00:00', '25/05/2023 14:15:00',
        '25/05/2023 14:15:00'
    ],
    'categorical_column': [
        'category1', 'category1', 'category1', 'category1', 'category2',
        'category1', 'category1', 'category2', 'category2', 'category1'
    ]
}

df = pd.DataFrame(data)
# 转换时间列,注意格式是日/月/年
df['time_of_day'] = pd.to_datetime(df['time_of_day'], format='%d/%m/%Y %H:%M:%S')

步骤2:计算同分类的1小时窗口计数

用分组+滚动窗口的方式最直观,直接按分类分组后,对每条记录计算前后1小时内的同分类记录数:

# 先按分类和时间排序,确保滚动窗口计算准确
df = df.sort_values(['categorical_column', 'time_of_day'])

# 定义1小时的时间偏移量
hour_offset = pd.Timedelta(hours=1)

# 对每个分类分组,计算每条记录对应的窗口内记录数
df['window_count'] = df.groupby('categorical_column')['time_of_day'].transform(
    lambda x: x.rolling(
        window=hour_offset,
        center=True,  # 窗口以当前时间为中心,前后各1小时
        closed='both',  # 包含窗口两端的时间点记录
        on='time_of_day'
    ).count()
)

# 恢复原始数据的顺序(如果需要保留原顺序的话)
df = df.sort_index()

运行后得到的结果和示例完全一致:

time_of_day categorical_column  window_count
0 2023-05-25 11:30:00          category1           3.0
1 2023-05-25 11:30:00          category1           3.0
2 2023-05-25 11:45:00          category1           4.0
3 2023-05-25 12:35:00          category1           3.0
4 2023-05-25 13:00:00          category2           2.0
5 2023-05-25 13:30:00          category1           4.0
6 2023-05-25 13:45:00          category1           3.0
7 2023-05-25 14:00:00          category2           3.0
8 2023-05-25 14:15:00          category2           2.0
9 2023-05-25 14:15:00          category1           3.0

补充:大数据量优化方案

如果你的数据集非常大,merge_asof的性能会更优,这里提供一种实现思路(不过上面的rolling方法逻辑更清晰,小数据量优先用):

df_match = df.copy()
# 按分类和时间排序
df = df.sort_values(['categorical_column', 'time_of_day'])
df_match = df_match.sort_values(['categorical_column', 'time_of_day'])

# 匹配同分类下时间在当前时间±1小时内的所有记录
merged = pd.merge_asof(
    df,
    df_match,
    on='time_of_day',
    by='categorical_column',
    tolerance=hour_offset,
    direction='nearest'
)
# 后续可通过分组计数得到窗口数量,具体逻辑可根据需求调整

内容的提问来源于stack exchange,提问作者Daniel Wyatt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:13:09