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

如何基于Pandas datetime列的时间部分分组并聚合?

仅基于时间部分分组聚合DataFrame的简洁方法

嘿,我帮你搞定这个问题!你遇到的TypeError是因为pd.Grouper的freq参数只支持datetime64类型的列,而你单独提取的time列是datetime.time类型,所以没法直接用频率分组。下面给你两种简洁的实现方式,不用绕弯子做复杂转换:

方法1:直接从datetime列提取时间分组键(最简洁)

利用Pandas的dt.floor()方法,先把原始datetime列的时间部分向下取整到你需要的频率(比如5分钟),再提取时间值作为分组键,直接聚合:

import numpy as np
import pandas as pd

# 生成原始数据
drange = pd.date_range('2019-08-01 00:00', '2019-08-12 12:00', freq='1T')
c0 = np.random.rand(len(drange))
c1 = np.random.rand(len(drange))
df = pd.DataFrame(dict(drange=drange, c0=c0, c1=c1))

# 按5分钟时间间隔分组,计算均值
result = df.groupby(df['drange'].dt.floor('5T').dt.time)[['c0', 'c1']].mean()
print(result.head())

这种方法不需要额外添加列,一行代码就能完成分组逻辑,而且完全忽略了日期部分——不管是哪一天的00:00-00:05,都会被分到同一组。

方法2:结合pd.Grouper的归一化日期法

如果你更习惯用pd.Grouper,可以先把所有datetime的日期部分统一成同一天(比如2000-01-01),只保留时间信息,这样就能正常使用freq参数了:

# 归一化日期:保留时间,把日期统一为固定某天
df['normalized_dt'] = pd.Timestamp('2000-01-01') + (df['drange'] - df['drange'].dt.normalize())

# 用pd.Grouper按5分钟分组聚合
result2 = df.groupby(pd.Grouper(key='normalized_dt', freq='5T'))[['c0', 'c1']].mean()
# 可选:把索引转回datetime.time类型,和方法1的结果格式一致
result2.index = result2.index.time
print(result2.head())

这种方法适合需要调整分组标签(比如用label='right'把分组标签设为时间区间的右端点)或者使用更复杂频率规则的场景。

额外小技巧

如果只是按小时、半小时这类固定单位分组,还可以直接提取时间分量组合分组:

# 按小时分组
hourly_result = df.groupby(df['drange'].dt.hour)[['c0', 'c1']].mean()
# 按15分钟间隔分组(用分钟//15)
quarterly_result = df.groupby(df['drange'].dt.minute // 15)[['c0', 'c1']].mean()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:46:54