前言
自從工作以來,好久都沒寫代碼了。昨天本來想着幫女朋友做些工作,結果比人家做的還慢,不僅沒有吃中飯還耽誤了吃晚飯的時間。但是這個過程中發生了好多有意思的事情,記下來希望對大家有所幫助。
發現好多技能“用進退廢”現象很嚴重,最好要實時溫習。
需求
從一張超大的員工信息表(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')