如何完善Python代码实现自定义财年下员工薪资表格视图转换(适配PowerBI)
问题:PowerBI中按财年(12月至次年11月)计算并展示员工月度薪资
背景信息
- 员工任职时间:2020年12月1日至2022年4月17日
- 年薪:40000
- 财周期定义:12月至次年11月(如2021财年为2020年12月-2021年11月,2022财年为2021年12月-2022年11月)
原数据表格
| Employee start date | Employee end date | Annual Salary |
|---|---|---|
| 12/1/2020 | 4/17/2022 | 40000 |
需求展示效果
选择2021财年时
员工全年任职,月度薪资为 40000/12≈3,333.33,展示表格:
| Dec | Jan | Feb | Mar | Apr | May | June | July | August | Sep | Oct | Nov |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 | 3,333.33 |
选择2022财年时
员工仅任职2021年12月至2022年4月共5个月,月度薪资为 40000/5=8,000.00,展示表格:
| Dec | Jan | Feb | Mar | Apr | May | June | July | August | Sep | Oct | Nov |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 8,000.00 | 8,000.00 | 8,000.00 | 8,000.00 | 8,000.00 |
已完成的Python代码
dataset["Employee start date"] = pd.to_datetime(dataset["Employee start date"], format="%m/%d/%Y") dataset["Employee end date"] = pd.to_datetime(dataset["Employee end date"], format="%m/%d/%Y") dataset['months'] = [pd.period_range(s, e, freq='m') for s, e in zip(dataset['Employee start date'], dataset["Employee end date"]) ] dataset = dataset.explode('months').reset_index(drop=True)
后续实现步骤
1. 为月份分配财年
将period类型转为datetime,再根据财周期规则计算每个月份所属的财年:
# 转换period为datetime类型,方便提取年月 dataset['months'] = dataset['months'].dt.to_timestamp() # 计算财年:12月归属下一年财年,其他月份归属当年财年 dataset['Fiscal Year'] = dataset.apply(lambda x: x['months'].year + 1 if x['months'].month == 12 else x['months'].year, axis=1)
2. 按财年统计任职月份并计算月度薪资
分组统计每个财年的任职月份数,结合年薪计算月度薪资:
# 按财年分组,统计任职月份数和对应年薪 fiscal_summary = dataset.groupby('Fiscal Year').agg( Total_Months=('months', 'nunique'), Annual_Salary=('Annual Salary', 'first') ).reset_index() # 计算月度薪资 fiscal_summary['Monthly_Salary'] = fiscal_summary['Annual_Salary'] / fiscal_summary['Total_Months']
3. 生成财年月度薪资矩阵
生成每个财年对应的12个月份(Dec到Nov),并填充对应薪资,空值留空:
# 定义财年的月份顺序(从Dec到Nov) fiscal_months = ['Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'August', 'Sep', 'Oct', 'Nov'] result = [] for _, row in fiscal_summary.iterrows(): fiscal_year = row['Fiscal Year'] monthly_salary = row['Monthly_Salary'] # 获取当前财年员工实际任职的月份缩写 employee_months = dataset[dataset['Fiscal Year'] == fiscal_year]['months'].dt.strftime('%b').tolist() # 构建每个月份的薪资值 salary_row = {month: monthly_salary if month in employee_months else None for month in fiscal_months} salary_row['Fiscal Year'] = fiscal_year result.append(salary_row) # 转为DataFrame并设置格式 result_df = pd.DataFrame(result).set_index('Fiscal Year') # 格式化薪资为带千分位的两位小数,空值显示为空字符串 for month in fiscal_months: result_df[month] = result_df[month].apply(lambda x: f"{x:,.2f}" if pd.notna(x) else "")
4. PowerBI端配置
- 将处理后的
result_df导入PowerBI - 添加财年切片器,选择对应财年即可展示目标表格
- 调整表格列顺序为
Dec到Nov,可按需设置列的对齐方式
内容的提问来源于stack exchange,提问作者kp987
相关产品推荐
相关产品推荐

