前言
自从工作以来,好久都没写代码了。昨天本来想着帮女朋友做些工作,结果比人家做的还慢,不仅没有吃中饭还耽误了吃晚饭的时间。但是这个过程中发生了好多有意思的事情,记下来希望对大家有所帮助。
发现好多技能“用进退废”现象很严重,最好要实时温习。
需求
从一张超大的员工信息表(EXCEL)中,抽取对应列数据,计算员工的司龄。同时需要分年度统计,分别统计2015~2019年司龄满五年、司龄五年以上、司龄十年和司龄十年以上员工,主要问题是该表中既有在职员工也有离职员工。而且离职员工也要计算当年司龄。
过程
读取数据
第一步就遇到问题了,因为源文件有密码,所以用pandas读取的时候会报错。出现错误XLRDError: Can't find workbook in OLE2 compound document
。参考这篇文章,有两种解决方法:
- 删除密码保护,最简单高效,劝各位用这种方法就好。
- 使用‘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')