如何按列值扩展DataFrame行并解决跨年度周计算报错问题
解决方案
错误原因
math.floor()只能处理单个数值,无法直接作用于Pandas Series(批量数据),这是触发TypeError的核心原因。需要改用支持向量运算的方法实现年份增量计算。
完整实现代码
import pandas as pd import numpy as np # 读取数据 df = pd.read_excel("test data.xlsx") # 1. 按# of weeks扩展每行 df = df.loc[df.index.repeat(df["# of weeks"])].reset_index(drop=True) # 2. 添加每个Id的周计数列 df['Week Count'] = df.groupby(['Id']).cumcount() + 1 # 3. 计算每周工时(平均分配为整数) df['Labor'] = df['Manhours'] // df['# of weeks'] # 4. 计算从起始周开始的累计总周数 total_weeks = df['Starting Week period'] + df['Week Count'] - 1 # 5. 计算年份与年度周数(支持任意跨年场景) df['Year'] = df['Starting Year'] + (total_weeks - 1) // 52 df['Week #'] = (total_weeks - 1) % 52 + 1 # 6. 为Week #添加前导0 df['Week #'] = df['Week #'].astype(str).str.pad(2, side='left', fillchar='0') # 7. 拼接Year与Week #生成Period列 df['Period'] = df['Year'].astype(str) + "-" + df['Week #']
关键逻辑说明
- 年份计算:
(total_weeks - 1) // 52计算需要增加的年份数,例如第53周时得到1(年份+1),第105周时得到2(年份+2),完美支持跨多年的场景。 - 年度周数计算:
(total_weeks - 1) % 52 + 1实现周数的循环重置,例如第53周返回1,第105周返回3,符合年度周数的计数规则。 - 工时计算:用整数除法
//保证结果为整数,与示例输出一致;若需保留小数,替换为普通除法/即可。
验证结果
运行上述代码后,你的示例数据会生成与目标完全一致的输出,同时可处理跨2年及以上的极端场景(比如起始周为50、周数为10的情况,会覆盖2023年第50-52周、2024年第1-7周)。
内容的提问来源于stack exchange,提问作者user21126867
相关产品推荐
相关产品推荐

