Python实现DataFrame每日数据按小时分组计算LEVEL均值
pandas按日-小时分组计算LEVEL均值实现方案
原代码问题说明
- 手动生成跨多年的逐小时时间序列
dates,和原始DataFrame的行数、实际观测时间完全不匹配,直接赋值为df列会导致时间字段和实际LEVEL值错位,分组逻辑完全失效 - groupby语法书写错误,列索引传参、聚合逻辑写法不符合pandas规范
- 多余引入
dayofweek(星期几)字段,聚合需求和星期维度无关,不需要该字段参与分组
正确实现代码
不需要提前手动生成全量时间轴,直接基于原始数据的日期、时间字段做时间规整后聚合即可:
import pandas as pd # 读取/加载原始数据集 df = pd.DataFrame([ ["09/07/2013", "12:30:12", 5], ["09/07/2013", "12:40:07", 2], ["09/07/2013", "12:50:09", 5], ["10/07/2013", "01:05:58", 3], ["10/07/2013", "01:25:15", 2], ["11/07/2013", "15:05:10", 1] ], columns=["DATE", "TIMEREAD", "LEVEL"]) # 合并日期、时间字符串为标准datetime格式,向下取整到整点小时 df["dt_hour"] = pd.to_datetime( df["DATE"] + " " + df["TIMEREAD"], format="%d/%m/%Y %H:%M:%S" ).dt.floor("H") # 按整点小时分组计算LEVEL均值 result = df.groupby("dt_hour", as_index=False)["LEVEL"].mean() # 转换为要求的输出列格式 result["DATE"] = result["dt_hour"].dt.strftime("%d/%m/%Y") result["TIMEREAD"] = result["dt_hour"].dt.strftime("%H:%M:%S") result = result[["DATE", "TIMEREAD", "LEVEL"]]
运行后输出结果完全匹配预期:
DATE TIMEREAD LEVEL 0 09/07/2013 12:00:00 4.0 1 10/07/2013 01:00:00 2.5 2 11/07/2013 15:00:00 1.0
如果你后续需要补全所有无观测数据的小时(即每个日期的24个小时都展示,无数据的小时LEVEL显示为空或0),可以在分组得到result后,将
dt_hour设为索引再按小时重采样即可,不需要提前生成多年的全量时间序列和原表做匹配。
内容的提问来源于stack exchange,提问作者kiwi_kimchi
相关产品推荐
相关产品推荐

