Pandas按区间分组、加权平均及时间标签转换实现求助
解决方案
直接通过pd.cut分箱+分组聚合即可完成需求,具体实现代码及说明如下:
完整代码实现
import pandas as pd import numpy as np def average_speed_mean(x): try: return np.average(x["average_speed"], weights=x["count"]) except ZeroDivisionError: return 0 # 定义分箱边界与对应时间标签 bins = [1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93] # 每个区间对应1小时,[1-4]→0点,[5-8]→1点,以此类推生成23个时间标签 time_labels = [f"{h}h00m00s" for h in range(23)] # 1. 对time_gap进行分箱,绑定时间标签 df_merged['time_interval'] = pd.cut( df_merged['time_gap'], bins=bins, labels=time_labels, include_lowest=True # 确保第一个区间包含time_gap=1的数值 ) # 2-3. 分组统计count总和、计算average_speed加权平均 result_df = df_merged.groupby('time_interval').agg( total_count=('count', 'sum'), weighted_avg_speed=('average_speed', average_speed_mean) ).reset_index() # 4. 将时间标签转为datetime类型(可选择仅保留时间或添加日期) # 仅保留时间部分 result_df['time_interval'] = pd.to_datetime(result_df['time_interval'], format='%Hh%Mm%Ss').dt.time # 若需完整datetime(例如指定日期为2024-01-01) # result_df['time_interval'] = pd.to_datetime('2024-01-01 ' + result_df['time_interval'], format='%Y-%m-%d %Hh%Mm%Ss')
关键细节说明
pd.cut的include_lowest=True参数:保证第一个区间[1,5)能包含time_gap=1的记录- 时间标签生成逻辑:每个分箱区间对应4个15分钟间隔(合计1小时),因此从0到22点生成23个标签,与分箱结果数量匹配
- 聚合操作直接复用自定义的加权平均函数,自动处理除零异常场景
内容的提问来源于stack exchange,提问作者Para
相关产品推荐
相关产品推荐

