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

如何完善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 dateEmployee end dateAnnual Salary
12/1/20204/17/202240000

需求展示效果

选择2021财年时

员工全年任职,月度薪资为 40000/12≈3,333.33,展示表格:

DecJanFebMarAprMayJuneJulyAugustSepOctNov
3,333.333,333.333,333.333,333.333,333.333,333.333,333.333,333.333,333.333,333.333,333.333,333.33

选择2022财年时

员工仅任职2021年12月至2022年4月共5个月,月度薪资为 40000/5=8,000.00,展示表格:

DecJanFebMarAprMayJuneJulyAugustSepOctNov
8,000.008,000.008,000.008,000.008,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:53:11