如何基于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
相关产品推荐
相关产品推荐

