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

Python pandas按CAT列类别分别执行时间维度分组计算资源R的方案

pandas按CAT分组统计各时间段资源占用量实现方案

问题背景

现有pandas DataFrame(记为df),需要基于开始时间ST、结束时间ET对资源变量R做分组统计,原始代码可以输出全量R的逐分钟累计值,但未区分CAT字段的类别取值,需要调整代码实现对每个CAT取值分别执行计算逻辑。

示例数据(表1)

import pandas as pd
df=pd.DataFrame({'RID': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10},
 'ST': {0: '0 days 04:52:00',
  1: '0 days 04:54:00',
  2: '0 days 04:56:00',
  3: '0 days 04:57:00',
  4: '0 days 04:57:00',
  5: '0 days 05:02:00',
  6: '0 days 05:04:00',
  7: '0 days 05:04:00',
  8: '0 days 05:06:00',
  9: '0 days 05:07:00'},
 'ET': {0: '0 days 05:06:00',
  1: '0 days 08:59:00',
  2: '0 days 10:16:00',
  3: '0 days 09:15:00',
  4: '1 days 01:33:00',
  5: '0 days 08:53:00',
  6: '0 days 19:08:00',
  7: '0 days 20:23:00',
  8: '0 days 09:24:00',
  9: '0 days 08:20:00'},
 'R': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1},
 'CAT': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3, 9: 3}})
# 提前转换时间类型避免重复计算
df['ST'] = pd.to_timedelta(df['ST'])
df['ET'] = pd.to_timedelta(df['ET'])

原始代码(未分组版本)

df1 = df.set_index('ET')
df2 = df.set_index('ST')
df_final = df1.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0)\
    .subtract(df2.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0), fill_value=0)\
    .cumsum()
x = pd.DataFrame(df_final.reset_index())

调整后按CAT分组的代码

核心思路是把原有逻辑封装为函数,通过groupby('CAT').apply()对每个类别单独计算:

def calc_cat_r(group):
    # 单个CAT分组内执行原有统计逻辑
    g_et = group.set_index('ET')
    g_st = group.set_index('ST')
    et_sum = g_et.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0)
    st_sum = g_st.groupby(pd.Grouper(freq='1Min')).sum()['R'].fillna(0)
    res = et_sum.subtract(st_sum, fill_value=0).cumsum()
    return res

# 按CAT分组计算,结果自动保留CAT字段
x_grouped = df.groupby('CAT').apply(calc_cat_r).reset_index()
# 重命名列方便后续使用
x_grouped.columns = ['CAT', '时间', 'R累计值']

可选扩展:结果宽表转换

如果需要把不同CAT的累计值展开为独立列,可补充pivot操作:

x_pivot = x_grouped.pivot(index='时间', columns='CAT', values='R累计值').fillna(0).reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:24:01