首页 > 编程语言 >实现python自动化进行薪资核算——数据读取、数据计算、数据输出

实现python自动化进行薪资核算——数据读取、数据计算、数据输出

时间:2023-09-03 23:31:39浏览次数:35  
标签:xlsx 读取 python 考勤 df 薪资 扣除 数据 lambda

前言

上一篇文章我们完成了相关准备工作——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自动化进行薪资核算——数据读取、数据计算、数据输出_数据

实现python自动化进行薪资核算——数据读取、数据计算、数据输出_python_02

总结

以上利用python实现简易的自动化薪资核算功能就完成了,大致思路还是很简单易懂的。如有不足,感谢指正!


标签:xlsx,读取,python,考勤,df,薪资,扣除,数据,lambda
From: https://blog.51cto.com/u_15928170/7343688

相关文章

  • 数据库的基本操作
    1.数据库的操作1.打开数据库-uroot:root为账号-p123456:123456为密码-h127.0.0.1:为地址mysql-uroot-p123456-h127.0.0.12.退出数据库exit\qquit3.注释符#/***/--4.数据库的增删改查增:createdatabasemydata;删:dropdatabasemydata;改:alterdata......
  • flask 实现数据流传递
    flask返回流数据:https://blog.csdn.net/asdq2w3d/article/details/131432889vue解析流数据:https://blog.csdn.net/qq_25741071/article/details/130137032......
  • fastadmin数据库改动后手工修改相关文件
    在项目开发过程中了,或二次开发时,项目的MVC文件已经做了大量的修改,不能直接使用后台的一键生成CURD来重新生成相关的文件了。需要我们手工去改相关的文件了。比如:数据库状态字段的值做了修改,去掉了其中一项。1、控制器->C检查关联查询/数据限制有没有配置,这个涉及关联数据能不能......
  • 现在的数据库的设计是越来越霸道了
    对现在数据库的设计方式慢慢的理解了,尤其是MySQL这样的容器化数据库在很多应用场景被应用后,某些互联网场景是应用的是得心应手,而到了一些传统行业MySQL并不是一个好的选择开始,理解了其他新老数据库都开始了霸道的设计,数据库的风向标变了。从老说起,商业看Oracle ,SQLServer,......
  • 电商类面试问题--01Elasticsearch与Mysql数据同步问题
    在实现基于关键字的搜索时,首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题,可以考虑两层方案。全量同步:全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时,对ES库进行全量数据同步操作,以确保数据的一致性。而在停止服务......
  • MongoDB 会丢数据吗? 在次补刀MongoDB 双机热备
    以后会争取每天一段感悟,不讨论对错,幼儿园的孩子才每件事论对错最强大的,这个词不一定是个好词,最强大的往往是最虚弱的,那些天天和你谈格局,谈奉献,谈爱,强大的人,很可能内心和垃圾堆里面的碎玻璃一样,闪闪发光。如何和这样的人交往呢,一定要把自己碎的更厉害,发出耀眼的光,此刻他就不和你谈格......
  • 电商类面试问题--01Elasticsearch与Mysql数据同步问题
    在实现基于关键字的搜索时,首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题,可以考虑两层方案。全量同步:全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时,对ES库进行全量数据同步操作,以确保数据的一致性。而在停止服务时......
  • 9-3|使用Python的scikit-learn库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:
    当然可以。以下是一个简单的例子,使用Python的`scikit-learn`库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:```pythonfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionim......
  • python案例
    游戏案例:猜数字游戏玩法说明:程序随机生成一个1到100之间的整数作为答案。玩家可以输入自己猜测的数字。如果玩家猜对了答案,则游戏结束,程序输出恭喜信息。如果玩家猜错了,程序会根据玩家的猜测给出一些提示信息,比如太大了或者太小了。代码语法:importrandomanswer=rand......
  • MyBatisPlus操作Oracle(插入数据主键自增)
    示例代码:代码不需要修改,需要操作的是相对应的数据库,在Oracle中是不支持ID自增的,这时候我们就需要手动设置一些规则,来让ORM框架支持自增(实际是数据库层面做的)MyBatisPlus操作Oracle关于oracle11g和12c发行时间以及区别:Oracle11g是Oracle公司在2007年发行的一款数据库软管......