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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:12:57