使用R處理時間資料(DateTimeClasses)的格式(lubricate, POSIXlt,POSIXlc)

「lubridate r package」的圖片搜尋結果

時間資料的處理,假如不借助現有的“時間類別”資料型態的話,會頗麻煩,比如有兩個時間要比看看誰先誰晚,想知道兩個時間的間隔,或是要進一步要篩選一堆時間資料根據某個特定的時間點,要自己用numeric來實現會麻煩一點,所以使用內建處理時間的函數像是as.POSIXlt, as.POSIXlc, as.Date會方便很多。他們本身就可以實現時間的加減等,另外,也可以使用lubricate軟件包,這是一個更為方便用來處理時間資料轉換的工具。

仔細研究會發現在電腦中的時間顯示也不是一件簡單的事,可以看此篇unix time,最重要的觀念是理解POSIX和epoch這兩種時間表達的方式,尤其是Epoch,其是所謂的reference time,它的目的是幫助簡化“時間值”彼此的加減運算,等於把時間轉換成距離某個“參考時間點”幾小時、幾分或是幾秒,那這樣就可以輕鬆地對兩組“時間值”彼此直接加減,不需要經過兩次換算,但這邊也容易造成使用者混淆,因為每個平台或是程式語言可能有彼此不一樣的epoch參照點,像是R的參照時間就是1970/01/01,所有的時間假如直接轉成數字的話,便是距離此時間點的天數(或是小時),端看時間裡所使用的最小單位。

下面是當我們想要進一步瞭解後面細節遇到的名詞:
1. POSIX(Portable Operating System Interface)
這其實是IEEE的標準中為了讓各個操作系統能保持一致的,裡頭包含了許多系統底層的規範包括Process, Signal, Memory violation, Pipe, C library, 當然timer也是其中的規範之一
2. Epoch(reference time)
Epoch是傳統年代表中用來參照的時間點,比如西元前和西元後中的epoch就是耶穌誕生日,而在計算機領域中不同的操作系統會有不同的epoch,像MATLAB就是以Jan 1, BC、GO則是用Jan 1, AC,Microsoft則是1990-1-0(真的是Jan 0),大多數的系統和語言像是JAVA, PHP, Ruby, Javascript, Perl,unix系統等則是使用1970,1,1。

R系統中DataTimeClasses主要有兩個物件:POSIXct, POSIXlt
1. POSIXct代表的是總秒數從1970/1/1開始算起(R裡面的epoch)
2. POSIXlt則是一個列表,裡面有跟時間相關的數值(秒、分、時、日、月、年等)

基本R時間數字的處理和轉換
可以將R內時間資料處理分成兩個大觀念來理解:資料格式和常用操作

在資料格式上,R裡面有兩大類:DatePOSIXct/POSIXlt
POSIXct/POSIXlt為承襲unix系統中處理時間的方式,自由度較高,也較複雜,使用的函數為as.POSIXct/as.POSIXlt
Date為簡單版的時間資料格式,就是由1970/01/01作為epoch的,使用的函數為as.Date

在處理時間的資料上,觀念上其實只有兩類操作
1. 時間“資料格式”轉換顯示方式(通常被忽視)
2. 非時間“資料格時”(為字串)轉換為時間”資料格式“
但通常沒有區分開這兩類時,很容易會感到挫折,因為…會發現函數的表現跟自己預期不太一樣,或是搞不清楚文檔在說什麼。當可以區分這兩類操作後,再來則是理解一點關於“電腦世界”制定時間的一些方法,才不會被一堆名詞搞矇,接者可以開始找一些不錯的函數包lubricate在處理一些時間資料的操作。

#第一類:本為時間資料格式,拿來轉換顯示格式
Sys.time()
#[1] "2017-03-19 23:14:28 CST"
class(Sys.time())
#[1] "POSIXct" "POSIXt"
time <- Sys.time()
format(Sys.time(), "%Y-%m-%d")

#第二類:本來是“字串”,要轉換成時間資料格式
as.POSIXct("2014-05-01", format="%Y-%m-%d")
[/code
或也可以使用lubricate函數來處理文字的轉換

ymd("20110604")
mdy("06-04-2011")
dmy("04/06/2011")

轉換成時間資料格式後,很多處理就變成很直覺性了,你可以直接加上秒數,或是兩個時間相減或是相加

Sys.time()
#[1] "2017-03-20 21:23:12 CST"
Sys.time() + 1000
[1] "2017-03-20 21:38:16 CST"
as.Date(Sys.time()) + 10
#[1] "2017-03-30"
as.Date(Sys.time()) + 15
[1] "2017-04-04"

閱讀參考:
1. Do more with dates and times in R with lubridate
2. Converting time zones in R: tips, tricks and pitfalls
3. Date data class
4. Date-Time class

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s