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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:20:27