前言
上一篇文章我们完成了相关准备工作——pandas库的安装以及相关库问题的解决,这篇文章实现简单的薪资核算工作。
功能要求
- 当前表格中,考勤扣除金额、个税扣除、实发工资目前是空缺的,最终生成的数据需要将上述三列的数据分别根据以下规则填充。
1、迟到次数核算方法:
- 3次以内不扣除
- 3次以上每多1次扣除100(也就是第4次开始)
2、个税扣除核算方法:
个税扣除
=
基础工资
-
五险一金扣除
-
考勤扣除金额
,然后进行以下方式核算:
- 不考虑个税起征点。
- 收入中不超过3000元的按3%税率缴纳个税。
- 3000元-12000元的按10%税率缴纳个税。
- 超过12000元不高于25000元的按税率20%计算。
- 25000元-35000元的按税率25%计算。
- 35000元-55000元的按税率30%计算。
- 55000元-80000元的按税率35%计算。
3、将算出的结果填充到.xlsx文件中
- 考前扣除金额填充至原文件中。
- 个税扣除填充至原文件中。
- 实发工资填充至原文件中。
大致思路
上一篇文章提到了实现该功能需要编写的python程序有:数据的读取、数据的计算、数据的输出。想要实现如下功能,需要掌握一些知识点。
数据的读取
python中提供了很多方便的数据读取函数,在之前的文章中(python学习——第十五弹)详细给大家介绍如何在python中读取文件并写入数据到文件中:
file=open('b.txt','a')#采用追加的方式打开文件b.txt
file.write('hello')
file.flush() #把缓冲区的内容写入到文件中,但是不关闭文件
file.write('world')#在文件中写入world
file.close()#关闭文件
或者是采用with语句进行文件的读写操作,并且为避免执行过程中遇到的“错误”导致程序运行异常,还搭配了try…except 语句进行异常信息打印:
try:
with open("a.txt") as f:
a=1/0 #异常操作
print(f.readlines())#读取文件信息
except Exception as error:#如果出现异常就打印出异常信息
print(error)
finally:
f.close()
那么在进行xlsx文件进行读取信息时,我们需要用到:
#读取Excel表格,指定sheet_name为‘Sheet1’
df = pd.read_excel('salary_1.xlsx',sheet_name='Sheet1')
数据的计算
计算考勤扣除金额
这里我们使用apply()方法实现对可迭代对象的批量操作,并搭配lambda函数作为aapply()方法的参数,从而实现对代码的简化。
使用lambda函数对迟到次数所扣除的金额进行计算:
lambda函数接收一个参数x,然后计算(x-3)*100的值。如果结果大于零,就返回该值;否则就返回0:
late_counts = df['迟到次数']
df['考勤扣除金额'] = late_counts.apply(lambda x :max((x-3)*100,0))
计算个税扣除
以第一个if。。。else语句为例:
将lambda函数作为apply()方法的一个参数,lambda函数接收一个x值,并对x值施加规则进行计算如果x值()不超过3000,就按照3%的税率缴纳个税,如果x*0.03
小于90,则返回x*0.03
;否则返回90;如果x>3000就进入下一个判断条件,以此类推。
# 计算个税扣除
taxable_incom = df['工资基数'] - df['五险一金扣除'] - df['考勤扣除金额']
df['个税扣除'] = taxable_incom.apply(lambda x:
min(x*0.03,90) if x<=3000 else
min(x*0.1,210) if 3000<x<=12000 else
min(x*0.2,1410) if 12000<x<=25000 else
min(x*0.25,2660) if 25000<x<=35000 else
min(x*0.3,4410) if 35000<x<=55000 else
min(x*0.35,7160) if 55000<x<=80000 else
x*0.45
)
填充实发工资
# 填充实发工资
df['实发工资'] = df['工资基数'] - df['五险一金扣除'] - df['考勤扣除金额']-df[‘个数扣除’]
数据的输出
前面两步的工作完成之后,就需要将整理好的数据再次写入到xlsx表格中并以xlsx形式输出,这时需要用到:
writer = pd.ExcelWriter('salary_output.xlsx')
df.to_excel(writer, 'Sheet1', index=False)
writer.close()
完整代码
import pandas as pd
#读取Excel表格,指定sheet_name
df = pd.read_excel('salary_1.xlsx',sheet_name='Sheet1')
# 计算考勤扣除金额
late_counts = df['迟到次数']
df['考勤扣除金额'] = late_counts.apply(lambda x :max((x-3)*100,0))
# 计算个税扣除
taxable_incom = df['工资基数'] - df['五险一金扣除'] - df['考勤扣除金额']
df['个税扣除'] = taxable_incom.apply(lambda x:
min(x*0.03,90) if x<=3000 else
min(x*0.1,210) if 3000<x<=12000 else
min(x*0.2,1410) if 12000<x<=25000 else
min(x*0.25,2660) if 25000<x<=35000 else
min(x*0.3,4410) if 35000<x<=55000 else
min(x*0.35,7160) if 55000<x<=80000 else
x*0.45
)
# 填充实发工资
df['实发工资'] = df['工资基数'] - df['五险一金扣除'] - df['考勤扣除金额']-df['个税扣除']
writer = pd.ExcelWriter('salary_output.xlsx')
df.to_excel(writer, 'Sheet1', index=False)
writer.close()
print('结果已经成功写表格!')
最终效果
可以看到在所运行该文件的同一目录下出现了一个名为salary_output.xlsx的文件,打开后我们看到最红呈现的结果是没问题的。
总结
以上利用python实现简易的自动化薪资核算功能就完成了,大致思路还是很简单易懂的。如有不足,感谢指正!