Kaggle 數據清洗挑戰 Day 3 - 快速解析日期(date)數據

今天是 Kaggle 數據清洗挑戰的第三天,任務是解析 date 型數據。相信我們都遇到過此類情況,拿到的數據集中有需要分析的日期數據,但它們的類型是 String,不便作圖,也不適合作為一個 factor 幫助我們進行預測。也可能你拿到的是 Timestamp 類型的數據(如:2005-10-30 T 10:45 UTC),而你只需要年份和月份信息。遇到這些情況,我們都可以使用 python 對其進行解析~

具體分為 5 個部分:

  1. Get our environment set up
  2. Check the data type of our date column
  3. Convert our date columns to datetime
  4. Select just the day of the month from our column
  5. 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的申請評分卡模型
年前的一個小計劃

TAG:數據挖掘 | 數據清洗 | 數據分析 |