如何对pandas时间序列5分钟分桶后执行多字段分组求和计算
解决方案
首先你之前的时间转换有个小问题,ts_ms是毫秒级时间戳,需要指定unit='ms'才能得到正确的时间值。后续的分组逻辑需要把「5分钟时间桶」和a/b/c三个字段同时作为分组维度,再对x/y/z字段求和即可,完整代码如下:
import pandas as pd # 1. 正确转换毫秒级时间戳为时间类型 df['ts_date'] = pd.to_datetime(df['ts_ms'], unit='ms') # 2. 同时按5分钟时间桶、a、b、c三个字段分组,对x、y、z求和 # 注意你的列名带后缀点,要和实际列名保持一致,比如是a.就写'a.' result = df.groupby([ pd.Grouper(key='ts_date', freq='5Min'), 'a.', 'b.', 'c.' ])[['x.', 'y.', 'z.']].sum().reset_index()
如果不需要在结果里保留时间桶字段,可以在最后加.drop('ts_date', axis=1)。
如果你的需求是先把所有数据按5分钟分桶,每个桶单独计算一次group by a,b,c sum(x,y,z),得到每个桶对应的聚合结果,可以用如下写法:
# 按5分钟分桶后,每个桶内单独执行分组聚合 bucket_results = [] for bucket_time, bucket_df in df.set_index('ts_date').groupby(pd.Grouper(freq='5Min')): agg_res = bucket_df.groupby(['a.', 'b.', 'c.'])[['x.', 'y.', 'z.']].sum().reset_index() # 可以给结果加个时间桶字段标识所属桶 agg_res['bucket_time'] = bucket_time bucket_results.append(agg_res) # 合并所有桶的结果 final_result = pd.concat(bucket_results, ignore_index=True)
内容的提问来源于stack exchange,提问作者nad
相关产品推荐
相关产品推荐

