如何统计当前时间前后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
相关产品推荐
相关产品推荐

