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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:46:17