import pandas as pd
def calculate_salary(employee_file, attendance_file):
"""
自动计算工资
- 读取员工信息
- 计算考勤
- 生成工资条
"""
# 读取员工信息
employees = pd.read_excel(employee_file)
# 读取考勤数据
attendance = pd.read_excel(attendance_file)
# 合并数据
salary_df = pd.merge(employees, attendance, on='工号')
# 计算加班费(假设基本工资/21.75/8为时薪)
salary_df['时薪'] = salary_df['基本工资'] / 21.75 / 8
salary_df['加班费'] = (
salary_df['平时加班'] * salary_df['时薪'] * 1.5 +
salary_df['周末加班'] * salary_df['时薪'] * 2 +
salary_df['节假日加班'] * salary_df['时薪'] * 3
)
# 计算应发工资
salary_df['应发工资'] = (
salary_df['基本工资'] +
salary_df['绩效工资'] * salary_df['绩效系数'] +
salary_df['加班费'] +
salary_df['补贴']
)
# 计算社保公积金(个人部分,假设养老8%、医疗2%、失业0.5%、公积金12%)
salary_df['社保个人'] = salary_df['应发工资'] * 0.105
salary_df['公积金个人'] = salary_df['应发工资'] * 0.12
salary_df['五险一金'] = salary_df['社保个人'] + salary_df['公积金个人']
# 计算应纳税所得额
salary_df['应纳税所得额'] = salary_df['应发工资'] - salary_df['五险一金'] - 5000 # 5000起征点
# 计算个税(简化版,按月度税率表)
def calc_tax(taxable_income):
if taxable_income <= 0:
return 0
elif taxable_income <= 3000:
return taxable_income * 0.03
elif taxable_income <= 12000:
return taxable_income * 0.10 - 210
elif taxable_income <= 25000:
return taxable_income * 0.20 - 1410
elif taxable_income <= 35000:
return taxable_income * 0.25 - 2660
elif taxable_income <= 55000:
return taxable_income * 0.30 - 4410
elif taxable_income <= 80000:
return taxable_income * 0.35 - 7160
else:
return taxable_income * 0.45 - 15160
salary_df['个税'] = salary_df['应纳税所得额'].apply(calc_tax)
# 计算实发工资
salary_df['实发工资'] = salary_df['应发工资'] - salary_df['五险一金'] - salary_df['个税']
# 生成工资条
salary_slip = salary_df[[
'工号', '姓名', '部门', '基本工资', '绩效工资', '绩效系数',
'加班费', '补贴', '应发工资', '五险一金', '个税', '实发工资'
]]
# 保存结果
salary_slip.to_excel('工资条.xlsx', index=False)
print('工资计算完成!')
print(f'- 员工人数: {len(salary_slip)}')
print(f'- 工资总额: {salary_slip["实发工资"].sum():,.2f} 元')
print(f'- 平均工资: {salary_slip["实发工资"].mean():,.2f} 元')
return salary_slip
# 使用
if __name__ == '__main__':
calculate_salary('员工信息.xlsx', '考勤数据.xlsx')