如何对时间序列按分桶分组计算加权平均,现有代码返回空如何解决
问题分析
你的代码存在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
相关产品推荐
相关产品推荐

