礼哲

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

自从工作以来,好久都没写代码了。昨天本来想着帮女朋友做些工作,结果比人家做的还慢,不仅没有吃中饭还耽误了吃晚饭的时间。但是这个过程中发生了好多有意思的事情,记下来希望对大家有所帮助。
发现好多技能“用进退废”现象很严重,最好要实时温习。

需求

从一张超大的员工信息表(EXCEL)中,抽取对应列数据,计算员工的司龄。同时需要分年度统计,分别统计2015~2019年司龄满五年、司龄五年以上、司龄十年和司龄十年以上员工,主要问题是该表中既有在职员工也有离职员工。而且离职员工也要计算当年司龄。

过程

读取数据

第一步就遇到问题了,因为源文件有密码,所以用pandas读取的时候会报错。出现错误XLRDError: Can't find workbook in OLE2 compound document。参考这篇文章,有两种解决方法:

  1. 删除密码保护,最简单高效,劝各位用这种方法就好。
  2. 使用‘xlwings’读取文件。

数据整合

想将抽取的数据列整合到一个DATaFrame中,本来用的是append方法,结果变成按行插入。虽然能用,但是不利于数据读取。最终参考这篇文章,使用zip()将提取的几列合并到一个新的DataFrame中,直接合并会失去标题行,需要重新为每列数据命名。
new_data = pd.DataFrame(list(zip(number, name, stage)), columns = ['number', 'name', 'stage'])#number,name和stage是相应的抽取出来的列。

数据清洗

有些数据离职时间会有缺失,为了填补缺失,采用离职申请提交时间或者离职证明发放时间作为离职时间,如果都没有那就设置为今天。这个过程中发现问题,在excel中完全相同的格式,到了pandas总就变成三种不同格式时间,分别是float、pandas._libs.tslibs.timestamps.Timestamp、datetime.datetime。注意在同一个DataFrame中可能存在不同格式的时间。

司龄计算

计算司龄主要就是时间差,时间数据转化与计算参考了这篇文章

数据输出

来的时候是excel,输出也想要excel。使用to_excel(),结果有乱码,即使指定编码格式是utf8都不行。参考这篇文章,将编码格式设置为utf_8_sig,结果好的多。df.to_csv(file_name2, encoding='utf_8_sig')

希望对大家有帮助!###

posted on 2019-12-22 08:35  礼哲  阅读(1924)  评论(0编辑  收藏  举报