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

如何对时间序列按分桶分组计算加权平均,现有代码返回空如何解决

问题分析

你的代码存在4个核心错误导致输出为空、计算结果异常:

  • 自定义agg_func函数没有return分组聚合后的结果,apply执行后没有返回值,最终生成空DataFrame
  • 时间戳解析错误:ts_ms是毫秒级时间戳,pd.to_datetime默认按纳秒解析,生成的时间完全错误,导致时间桶分组失效
  • 加权平均逻辑错误:lambda中调用全局df.flow.sum(),计算的是全数据集的flow总和,不是当前分组内的flow总和,加权结果完全错误
  • 列名不匹配:示例数据的列名末尾带.(如a./latency.),代码中如果直接写a/latency会找不到列,触发隐式错误
修正方案

不需要嵌套两次groupby,直接同时按5分钟时间桶+a/b/c字段分组即可,逻辑更清晰性能更高,修正后代码如下:

import pandas as pd

# 定义分组内加权平均函数
def duration_weighted_avg(x):
    # 取当前分组内的flow列
    group_flow = df.loc[x.index, "flow"]
    return (x * group_flow).sum() / group_flow.sum()

# 1. 正确解析毫秒级时间戳
df['ts_date'] = pd.to_datetime(df['ts_ms'], unit='ms')
df.set_index('ts_date', inplace=True)

# 2. 同时按时间桶、a/b/c字段分组聚合
# 注意:如果你的实际列名带`.`后缀,将下方列名替换为`a.`/`b.`/`c.`/`latency.`即可
df1 = df.groupby([pd.Grouper(freq='5min'), 'a', 'b', 'c']).agg(
    latency_sum=("latency", "sum"),
    duration_weighted=("duration", duration_weighted_avg)
# 3. 重置索引,将分组键转为普通列,符合你需要的输出结构
).reset_index()

执行后df1就会包含你期望的所有字段,to_dict('records')也能正常输出结果。

内容的提问来源于stack exchange,提问作者nad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:51:03