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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:45:34