如何在Pandas中按星期列与分钟区间分组(排除日期)
解决按星期几+当日15分钟区间分组统计的问题
问题根源
你之前的代码使用pd.Grouper(freq=...)是基于完整的datetime索引分组,会把每个日期的同时间段当成独立分组,无法实现跨日期聚合同一星期几的相同时间区间数据。
解决方案
核心思路:从datetime索引中提取当日内的15分钟区间标签(仅保留时间、剔除日期),再结合Day_of_the_week字段进行分组聚合。
步骤1:生成当日15分钟区间标签
从datetime索引中提取15分钟区间的起始时间,只保留时分部分:
# 向下取整到最近的15分钟起始点,再提取时间部分(剔除日期) df_data_for_statistics['time_15min'] = df_data_for_statistics.index.floor('15min').time
生成的time_15min列会是datetime.time(22, 0)、datetime.time(22, 15)这类时间对象,所有跨日期的同一星期几、同一15分钟区间的行都会共享该标签。
步骤2:分组聚合计算均值和最大值
一次性完成分组与多指标聚合,避免重复分组提升效率:
df_statistics = df_data_for_statistics.groupby(['Day_of_the_week', 'time_15min'])['HL_delta'].agg( HL_mean='mean', HL_max='max' ).reset_index()
可选优化:格式化区间文本
如果需要更直观的区间描述(如22:00-22:15),可以生成字符串格式的区间标签:
# 生成区间起始/结束时间的字符串格式 df_data_for_statistics['start_time'] = df_data_for_statistics.index.floor('15min').strftime('%H:%M') df_data_for_statistics['end_time'] = (df_data_for_statistics.index.floor('15min') + pd.Timedelta(minutes=15)).strftime('%H:%M') df_data_for_statistics['time_interval'] = df_data_for_statistics['start_time'] + '-' + df_data_for_statistics['end_time'] # 使用格式化后的标签分组 df_statistics = df_data_for_statistics.groupby(['Day_of_the_week', 'time_interval'])['HL_delta'].agg( HL_mean='mean', HL_max='max' ).reset_index()
关键逻辑说明
floor('15min'):将每个datetime向下取整到最近的15分钟起始点,确保同一时间区间的记录被归为一组。.time:提取时间部分剔除日期,实现跨日期聚合同一星期几的同时间段数据。- 批量聚合:通过
agg()一次性指定多个统计指标,避免重复执行分组操作。
内容的提问来源于stack exchange,提问作者fede72bari
相关产品推荐
相关产品推荐

