Pandas按分组将运行累计数据划分至离散时间箱及报错解决
报错原因
抛出SyntaxError的直接原因是groupby传参时写法错误:你误用f-string格式把列名、分箱逻辑全部包裹在错误的引号结构里,属于基础语法错误,Python解释器无法解析。
原代码除了语法错误,还有3个逻辑问题会导致结果不符合预期:
- 分箱步长设置错误:需求明确是92个间隔900秒的时间箱,总时长为82800秒,步长应设为900,而非代码里写的92
pd.cut默认返回区间类型结果,无法直接输出要求的数值型时间箱端点- 统计逻辑错误:原始数据的
C_INTAKE本身是累计值,不需要对箱内数值求和,应取每个时间箱范围内的最大累计值(累计值单调递增,最大值即为该时间节点的累计摄入量),同时需要补全无原始观测的空时间箱,沿用之前的累计值。
可直接运行的实现代码
代码内置测试配置(间隔10、覆盖0-100区间),可直接匹配你给出的样例输出验证逻辑;实际使用时切换到900秒间隔的配置即可。
import pandas as pd import numpy as np # 读取数据 intake = pd.read_csv("https://raw.githubusercontent.com/yadatree/AL/main/intake.csv") # 统一列名,注意和你实际数据的列名匹配 df = intake.rename(columns={ 'SUBJECT': 'subject', 'TIME': 'time', 'C_INTAKE': 'c_intake' })[['subject', 'time', 'c_intake']] # ------------- 配置项 ------------- # 测试用配置(间隔10,覆盖0-100,匹配样例输出) bin_interval = 10 max_time = 100 # 实际生产配置(900秒间隔,覆盖82800秒,共93个时间点/92个间隔),使用时注释上面两行、放开下面两行 # bin_interval = 900 # max_time = 82800 # --------------------------------- # 生成全量时间箱端点 bin_times = np.arange(0, max_time + bin_interval, bin_interval) # 给原始数据匹配对应时间箱,区间规则为左闭右开,和样例逻辑对齐 df['bintime'] = pd.cut( df['time'], bins=[-np.inf] + list(bin_times), labels=bin_times, right=False ).astype(float) # 按受试者、时间箱分组,取每个箱内的最大累计摄入量 bin_stat = df.groupby(['subject', 'bintime'], as_index=False)['c_intake'].max() # 生成每个受试者的全量时间箱框架,补全没有观测值的空箱 full_bin_frame = pd.MultiIndex.from_product( [df['subject'].unique(), bin_times], names=['subject', 'bintime'] ).to_frame(index=False) # 合并统计结果,空值向前填充(无新摄入的时间箱沿用之前的累计值),初始0值补全 result = full_bin_frame.merge(bin_stat, on=['subject', 'bintime'], how='left') result['c_intake'] = result.groupby('subject')['c_intake'].ffill().fillna(0) # 重命名列匹配要求的输出格式 result.columns = ['SUBJECT', 'BINTIME', 'C_INTAKE2'] print(result)
输出验证
运行测试配置时,输出和你给出的期望格式完全一致:
SUBJECT BINTIME C_INTAKE2 0 C02 0.0 0.0 1 C02 10.0 0.0 2 C02 20.0 0.0 3 C02 30.0 0.0 4 C02 40.0 0.0 5 C02 50.0 0.4 6 C02 60.0 0.6 7 C02 70.0 0.6 8 C02 80.0 0.6 9 C02 90.0 1.1 10 C02 100.0 1.1 ...
内容的提问来源于stack exchange,提问作者yt3
相关产品推荐
相关产品推荐

