如何用pandas重采样时间序列DataFrame获取全年各小时平均数据?
解决Pandas按小时聚合全年同一时段均值的问题
你当前使用df.Value.resample('H').mean()得到的是每日每个小时的单独均值,但要实现「所有日期中同一小时的整体平均值」,可以通过以下两种简洁方法完成:
方法1:直接按小时字段分组聚合
这是最直接的方式,通过提取时间的小时部分作为分组键,直接计算所有同小时数据的均值:
情况A:时间列为DataFrame的索引
import pandas as pd # 提取索引的小时作为分组依据,计算均值 hourly_overall_mean = df['Value'].groupby(df.index.hour).mean() # 将小时索引格式化为 HH:MM:SS 形式 hourly_overall_mean.index = hourly_overall_mean.index.map(lambda h: f"{h:02d}:00:00") # 重置索引并整理列名 hourly_overall_mean = hourly_overall_mean.reset_index().rename(columns={ 'index': '时间日期', 'Value': '数值' })
情况B:时间为普通列(如列名为「时间日期」)
import pandas as pd # 确保时间列是datetime类型(若未转换) df['时间日期'] = pd.to_datetime(df['时间日期']) # 按时间列的小时部分分组,计算均值 hourly_overall_mean = df.groupby(df['时间日期'].dt.hour)['Value'].mean() # 格式化索引为时间字符串 hourly_overall_mean.index = hourly_overall_mean.index.map(lambda h: f"{h:02d}:00:00") # 重置索引并整理列名 hourly_overall_mean = hourly_overall_mean.reset_index().rename(columns={ '时间日期': '时间日期', 'Value': '数值' })
方法2:基于resample结果二次聚合
如果已经有了按小时重采样后的每日小时均值,可以在此基础上再次按小时分组,计算全年同小时的整体均值:
import pandas as pd # 先得到每日各小时的均值 daily_hourly_means = df['Value'].resample('H').mean() # 按小时部分分组,计算全年同小时的整体均值 hourly_overall_mean = daily_hourly_means.groupby(daily_hourly_means.index.hour).mean() # 格式化索引并整理列名 hourly_overall_mean.index = hourly_overall_mean.index.map(lambda h: f"{h:02d}:00:00") hourly_overall_mean = hourly_overall_mean.reset_index().rename(columns={ 'index': '时间日期', 'Value': '数值' })
最终输出示例
执行上述代码后,你会得到符合预期的结果:
| 时间日期 | 数值 |
|---|---|
| 00:00:00 | 55 |
| 01:00:00 | 24 |
内容的提问来源于stack exchange,提问作者Jalal
相关产品推荐
相关产品推荐

