在Pandas中按小时分组并保留小时级Datetime信息的实现方法
按小时分组计算均值并保留Datetime格式索引的解决方案
先还原你的原始数据(已转换为datetime类型):
import pandas as pd data = { 'date': ['2017-08-01 00:00:00', '2017-08-01 00:00:01', '2017-08-01 00:00:03', '2017-08-01 00:00:05', '2017-08-01 00:00:06'], 'A': [3,3,3,3,3], 'I': [56,57,58,52,50], 'r': [4,1,9,10,1], 'z': [6.,6,6,2.,1] } df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date'])
你遇到的问题是用df.groupby(df['date'].dt.hour).mean()后,索引变成了单纯的小时数字(0、1...),丢失了完整的日期时间信息。要保留datetime64[ns]类型的小时级时间标识,有两个实用的解决方案:
方法一:用resample(推荐,专为时间序列设计)
resample是pandas专门处理时间序列重采样的工具,直接按小时聚合就能自动保留datetime格式的索引:
# 按小时重采样并计算均值,on参数指定时间列 hourly_mean = df.resample('H', on='date').mean() # 如果需要把datetime索引转为普通列(和你的目标输出格式一致),执行reset_index() hourly_mean = hourly_mean.reset_index()
执行后hourly_mean的date列就是2017-08-01 00:00:00这样的datetime64[ns]类型。如果你的数据跨天,它会自动生成对应日期的小时起始时间,比如2017-08-02 01:00:00,完全贴合需求。
方法二:用groupby配合dt.floor
如果你更习惯用groupby,可以先把时间列向下取整到小时,再按处理后的列分组:
# 生成小时级datetime列(将所有时间戳统一到当前小时的起始点) df['hourly_date'] = df['date'].dt.floor('H') # 按新列分组计算均值,再整理列名 hourly_mean = df.groupby('hourly_date').mean().reset_index().rename(columns={'hourly_date': 'date'})
这个方法同样能得到类型为datetime64[ns]的date列,效果和resample一致,适合更偏好groupby逻辑的场景。
两种方法都能完美解决你的问题,其中resample更简洁高效,是时间序列聚合的首选方案。
内容的提问来源于stack exchange,提问作者may
相关产品推荐
相关产品推荐

