[一天一點R]-1.時間資料前處理(1)
一天R一點緣起
統計起家的我,R是我第一次接觸的資料分析語言,現在語言越來越多元,常常有時候,有一段時間沒寫 R,就很容易忘掉一些語法,雖說現在網路搜尋技術越來越好,只要關鍵字下的對,就不會找不到資料,尤其是現在最紅的資料分析語言,然而,雖然容易找到資料,同時資料量也隨之增大,需要更多時間來過濾資料的可用性與正確性,因此,萌生慢慢累積自己的筆記腦來降低大腦的負荷量,同時,也想嘗試透過這樣的方式,更精進與提高自己資料分析的效率,期望以一天一點的方式呈現,才能夠長時間的累積下去。
不同時間區間,資料特性會有所變化
大數據,大數據除了變數變多以外,時間不斷的積累下,數據量也越來越多,很多時候,不同時間區間下,資料的特性會有很明顯的變化,例如冰品的銷售,冬天與夏天截然不同,因此,時間變數幾乎是每一個資料集中必有的變數。
時間資料型態分類
R的時間資料型態分類,可以分為三種,
(1)純日期(Date)
(2)日期+時間(Date+time)
(3)日期+時間+時區(Date+time+ timezone)
三種不同的時間資料型態,有各自擅長處理的語言,
今天的R一點,以純日期(Date)為主。
統一時間資料格式:as.Date()
通常,從csv、spss、sql近來的時間資料格式不一定相同,因此,要先統一不同資料來源的時間資料型態,首選是 as.Date{ x:character data}的這個函數,此函數包含在base這個package中,R裡面的package就如同其他語言的libaray,一般的時間資料格式的輸出習慣以破折號和斜線為主(dashes or slashes)為主,例如2013年2月14日,會以2014/02/04、2014/2/4、2014-02-04或2014–2–4以上這四個寫法居多,這四種時間資料格式的寫法,as.Date都能處理。
as.Date(“2014/02/04”)
[1] “2014–02–04”
as.Date(“2014/2/4”)
[1] “2014–02–04”
as.Date(“2014–2–4”)
[1] “2014–02–04”
as.Date(“2014–02–04”)
如果很不巧的,你拿到的資料型態是很特殊的,以2014年2月14號為例,如果資料呈現為14/2/2014比較特殊的時間資料格式,設計下圖的對應表,讓處理時間資料格式更有彈性。
as.Date(‘2/14/2014’,format=’%m/%d/%Y’)
[1] “2014–02–14”as.Date(‘02/14/2014’,format=’%m/%d/%Y’)
[1] “2014–02–14”
取現在的時間
撰寫演算法時,我們常常會需要計算執行模組所需的時間,透過Sys.Date()這個函數,可以回傳今天的日期,date()則是回傳現在的日期與時間。
> Sys.Date( )
[1] “2018–08–02”
> date()
[1] “Thu Aug 02 23:00:44 2018”
因此,就能得知我寫這一篇文章的時間為2018年8月2號晚上11點整。
取兩個日期的天數差
Sys.Date() -as.Date(“1970–01–01”)Time difference of 17745 days
時間的加減
如果你想知道40天候是幾月幾日,就可以直接+40就行囉~
所以這邊要注意,as.Date的單位是"天"。
>as.Date(Sys.time())+40[1]“2018–09–12”
取出時間的年份、月份、星期?
如果我們要呈現的是歷年的趨勢變化,每個月的變化,一周的變化等,
這時,我們就必須從時間資料變數中萃取出年分、月與星期的資訊,然而as.Date所轉出的資料格式,能萃取出星期,但卻無法萃取出年分與月份,透過weekdays這個函數,我們就可以知道2014年2月14號是星期五囉~
> weekdays(as.Date(‘2014–02–14’))
[1] “星期五”
雖然這個資料格式使用上很簡單,但是卻無法萃取出年與月的資訊
因此,或許有更全面性的函數來進行時間資料格式的處理,
就改天再來介紹囉~
小提醒,上面的程式碼如果要貼在R code裡面,要注意的地方 :
> as.Date(“1970–01–01”)
Error in charToDate(x) :
character string is not in a standard unambiguous format
有時候是因為從另一個地方貼到R產生的錯誤,-重打就行囉~~
希望透過這樣的紀錄與分享,大家在資料科學領域一起精進,
如果內容上有錯誤的地方或者可以更好的地方,在請大家多多指教囉~
參考資料: