時間資料的處理,假如不借助現有的“時間類別”資料型態的話,會頗麻煩,比如有兩個時間要比看看誰先誰晚,想知道兩個時間的間隔,或是要進一步要篩選一堆時間資料根據某個特定的時間點,要自己用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裡面有兩大類:Date和POSIXct/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