數據處理隨筆-1


前言

自從工作以來,好久都沒寫代碼了。昨天本來想着幫女朋友做些工作,結果比人家做的還慢,不僅沒有吃中飯還耽誤了吃晚飯的時間。但是這個過程中發生了好多有意思的事情,記下來希望對大家有所幫助。
發現好多技能“用進退廢”現象很嚴重,最好要實時溫習。

需求

從一張超大的員工信息表(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')

希望對大家有幫助!###


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM