Kaggle 數據清洗挑戰 Day 3 - 快速解析日期(date)數據
今天是 Kaggle 數據清洗挑戰的第三天,任務是解析 date 型數據。相信我們都遇到過此類情況,拿到的數據集中有需要分析的日期數據,但它們的類型是 String,不便作圖,也不適合作為一個 factor 幫助我們進行預測。也可能你拿到的是 Timestamp 類型的數據(如:2005-10-30 T 10:45 UTC),而你只需要年份和月份信息。遇到這些情況,我們都可以使用 python 對其進行解析~
具體分為 5 個部分:
- Get our environment set up
- Check the data type of our date column
- Convert our date columns to datetime
- Select just the day of the month from our column
- Plot the day of the month to check the date parsing
1、搭建環境
首先還是引入需要的 lib 包和數據集,今天的數據是關於地震信息的:
# modules well useimport pandas as pdimport numpy as npimport seaborn as snsimport datetime# read in our datalandslides = pd.read_csv("../input/landslide-events/catalog.csv")# set seed for reproducibilitynp.random.seed(0)
2、查看日期數據的類型
我們先讀取日期列的前幾條數據,確保它真的含有日期數據:
# print the first few rows of the date columnprint(earthquakes[Date].head())
從結果看,這些數據確實包含日期信息,但機器並不知道它們代表著日期。我們看到下面的 dtype 是 object,Pandas 中用 object 保存各種類型的數據,但大多數都含有字元串。我們也可以不讀取前幾條數據,直接查看某一列數據的類型:
earthquakes[Date].dtype
3、將日期數據的類型變為 datetime
現在我們知道,這些代表日期的數據並沒有被機器識別為日期,所以就需要手動將它們轉換為 datetime 類型。這一步叫做 parsing date,因為我們要讀取一段字元串,對它的組成部分進行解析。
我們可以藉助 pandas 來解析這些日期數據,關於具體可能包含哪些部分,感興趣的可以查看 Pythons strftime directives。通過這步,我們能夠解析出數據的各個部分,以及分隔它們的符號。例如:
* 1/17/07 has the format "%m/%d/%y"
* 17-1-2007 has the format "%d-%m-%Y"
通過上一步,我們得知該地震信息數據集中的日期數據組成為 "month/day/four-digit year",所以我們可以按這個格式來解析所有的日期數據:
# create a new column, date_parsed, with the parsed datesearthquakes[date_parsed] = pd.to_datetime(earthquakes[Date], format = "%m/%d/%Y", errors=coerce)
??注意:由於數據中還有個別不是 "month/day/four-digit year" 格式,直接轉換的話會報錯,Pandas 提供了一個可選的參數 errors,傳入 errors=coerce,當遇到不能轉換的數據就會將其置為 NaN,我們之後再對其進行特別處理~ 但如果我們不設定 format,這個錯誤就會被忽略,不過就無法得到特定格式的日期數據了,可能影響之後分析工作。
查看一下成功轉換類型的數據:
earthquakes[date_parsed].sample(5)
然後再處理之前的漏網之魚,由於它們已經被置為 NaN,我們直接就可以查看了:
earthquakes[date_parsed].loc[earthquakes[date_parsed].isnull()]
我們看到有上面三條數據的格式需要特別處理,具體看一下它們到底什麼樣:
earthquakes[Date].loc[[3378,7512,20650]]
然後我們可以手動對其進行處理:
earthquakes[date_parsed][3378] = 1975-02-23earthquakes[date_parsed][7512] = 1985-04-28earthquakes[date_parsed][20650] = 2011-03-13
至此日期數據的類型和格式就基本上完美了!
4、按 month 選取所有 day
為了檢查我們剛才 parsing date 的成果,我們先從原始數據集中按 month 選取 day:
day_of_month_earthquakes = earthquakes[Date].dt.day
這時候得到一個錯誤:
出現這個錯誤的原因是 dt.day() 方法不知道如何處理一個 object 類型的數據。再換成處理後的數據看看:
day_of_month_earthquakes = earthquakes[date_parsed].dt.day
不報錯了。
5、作圖來再次檢查 date parsing 效果
parsing date 過程中最怕出現的 bug 是搞混「月「和」日「,所以我們通過作圖的方式來 double check 一下。
# remove nasday_of_month_earthquakes = day_of_month_earthquakes.dropna()# plot the day of the monthsns.distplot(day_of_month_earthquakes, kde=False, bins=31)
我們看到每個 1~30 每個日期的分布很平均,31 日偏低是因為只有一半月份有 31 日,恰好 31 日的數目大約是其他日子的 1/2,double-check 後可以確定我們的 date parsing 是成功的。
這就是 5 Day Challenge 第三天的內容,完畢~
推薦閱讀:
※機器學習(周志華)第一、二章
※對於面試演算法工程師的想法
※數據挖掘和網路爬蟲有什麼關聯區別?
※構建lending club的申請評分卡模型
※年前的一個小計劃