2017年6月2日 星期五

[ 學習筆記 ][ R 語言 ] 用 lubridate 套件的 ymd_hms 函數將時間資料從 character 快速轉成 POSIXct 形式

當我們要處理財經資料的時候,很容易遇到時間格式轉換處理的問題。
尤其像是面對交易的 tick 資料時動則數百萬筆。
在 R 中,如果用 as.POSIXct 處理的話,那個速度會讓人等到天荒地老。

假若時間格式是 "2017-06-01 12:34:56" 的 character 形式的話,
我們想把它改成 POSIXct 格式以利之後的資料處理。
這時,我們可以利用 lubridate 套件中的 ymd_hms 函數

library(lubridate)
ymd_hms("2017-06-01 12:34:56")

就可以把這個時間日期字串轉成 POSIXct 的時間資料格式了。




===============================================

以下我們用 2017-01-03 至 2017-05-26 的小型台灣指數期貨的 tick 檔為例:

從 2017-01-03 到 2017-05-26 共有 5028981 筆資料

> mtx
               Date Product Contract                Time Price Volume Nearer Further Opening
      1: 2017-01-03     MTX   201701 2017-01-03 08:45:00  9266    566     NA      NA       *
      2: 2017-01-03     MTX   201701 2017-01-03 08:45:00  9266      2     NA      NA        
      3: 2017-01-03     MTX   201701 2017-01-03 08:45:00  9266      2     NA      NA        
      4: 2017-01-03     MTX   201701 2017-01-03 08:45:00  9266      2     NA      NA        
      5: 2017-01-03     MTX   201701 2017-01-03 08:45:00  9265      2     NA      NA        
     ---                                                                                    
5028977: 2017-05-26     MTX   201803 2017-05-26 13:43:52  9628      2     NA      NA        
5028978: 2017-05-26     MTX   201803 2017-05-26 13:44:31  9628      2     NA      NA        
5028979: 2017-05-26     MTX   201803 2017-05-26 13:44:44  9628      2     NA      NA        
5028980: 2017-05-26     MTX   201803 2017-05-26 13:44:56  9628      2     NA      NA        
5028981: 2017-05-26     MTX   201803 2017-05-26 13:44:56  9629      2     NA      NA  


但是其中的 Time 格式為 character

> str(mtx)
Classes ‘data.table’ and 'data.frame': 5028981 obs. of  9 variables:
 $ Time    : chr  "2017-01-03 08:45:00" "2017-01-03 08:45:00" "2017-01-03 08:45:00" "2017-01-03 08:45:00" ...

如果我們用 as.POSIXct 轉換時間格式的話,執行的時間和轉換後的格式如下:

> system.time(mtx[,as.POSIXct(Time)])
   user  system elapsed 
102.399  34.636 137.121 

> str(mtx)
Classes ‘data.table’ and 'data.frame': 5028981 obs. of  9 variables:
 $ Time    : POSIXct, format: "2017-01-03 08:45:00" "2017-01-03 08:45:00" "2017-01-03 08:45:00" "2017-01-03 08:45:00" ...

如果我們用 lubridate package 的 ymd_hms() 函數轉換時間格式的話,執行的時間則為:

> system.time(mtx[,ymd_hms(Time)])
   user  system elapsed 
  0.939   0.117   1.058 

> str(mtx)
Classes ‘data.table’ and 'data.frame': 5028981 obs. of  9 variables:
 $ Time    : POSIXct, format: "2017-01-03 08:45:00" "2017-01-03 08:45:00" "2017-01-03 08:45:00" "2017-01-03 08:45:00" ...

兩者格式相同,但是速度相差了 130 倍...

沒有留言:

張貼留言

有什麼話想告訴我嗎?歡迎在此留言喔!