lubridate包,非常強大,能夠識別各種類型的日期.字符型和時間型數據,都是格式比較特別的你數據,在處理時,比較麻煩,但是有了lubridate這個包之后,時間處理變得非常簡單,這個包函數命名簡單,格式比較統一.
解析日期和時間
首先,lubridate函數的方便之處在於無論年月日之間以什么間隔符分隔,它總能找到正確的值且返回的是數字值,比如:
> year("2016-10-24")
[1] 2016
> year("2016/10/24")
[1] 2016
> month("2016/10/24")
[1] 10
> day("2016/10/24")
[1] 24
同時,lubridate還提供了函數幫助處理不同排列順序的年月日數據:
> ymd("20110604")
[1] "2011-06-04"
> mdy("06-04-2011")
[1] "2011-06-04"
> dmy("04/06/2011")
[1] "2011-06-04"
> dmy("04062011")
[1] "2011-06-04"
如果您的日期包含時間信息,添加H,M,和/或s函數的名稱。ymd_hms
可能是最常見的日期和時間格式。要閱讀的具體日期,具有一定的時區,提供在該時區的正式名稱tz
參數。
ymd_hms("20161120220000")
[1] "2016-11-20 22:00:00 UTC"
> ymd_hms("2016-11-20 22:00:00", tz = "Pacific/Auckland")
[1] "2016-11-20 22:00:00 NZDT"
ymd,mdy,dmy分別表示了三種常見的年月日排列方式,通過這種方式我們就可以把不同的日期數據都轉化為標准的日期數據。
時區
為了處理時區信息,lubridate包提供了三個函數:
tz:提取時間數據的時區
with_tz:將時間數據轉換為另一個時區的同一時間
force_tz:將時間數據的時區強制轉換為另一個時區
有兩個非常有用的事情要做日期和時區。首先,顯示不同的時區相同的時刻。二,創建由現有的時鍾時間與新的時區相結合的新時刻。
這些被完成with_tz
和force_tz
。
輸入meeting在Pacific/Auckland的開場時間,再轉為America/Chicago時間
> meeting <- ymd_hms("2011-07-01 09:00:00", tz = "Pacific/Auckland");meeting
[1] "2011-07-01 09:00:00 NZST"
> with_tz(meeting, "America/Chicago") #顯示不同的時區相同的時刻
[1] "2011-06-30 16:00:00 CDT"
> mistake <- force_tz(meeting, "America/Chicago");mistake
[1] "2011-07-01 09:00:00 CDT"
> with_tz(mistake, "Pacific/Auckland")
[1] "2011-07-02 02:00:00 NZST"
設置和提取信息
提取與功能的日期時間的信息second
,minute
,hour
,day
,wday
,yday
,week
,month
,year
,和tz
。您也可以使用這些設置(即改變)給定的信息。請注意,這將改變日期和時間,wday
並month
具有可選的label
參數,它取代了他們的數字輸出和平日或月的名稱。
> year("2011-08-10 14:20:01")
[1] 2011
> minute("2011-08-10 14:20:01")
[1] 20
> week("2011-08-10 14:20:01")
[1] 32
時間間隔
lubridate還允許我們定義一個時間區間,例如:
> interval(ymd(20161101), ymd(20161103))
[1] 2016-11-01 UTC--2016-11-03 UTC
兩個時間段是由--相連的,UTC表示時區
date1 <- as.POSIXct("2016-11-08 01:59:59") #POSIXct: 日期時間類,精確到秒,用數字表示
date2 <- as.POSIXct("2016-12-29 12:00:00")
interval(date1, date2)
[1] 2016-11-08 01:59:59 CST--2016-12-29 12:00:00 CST
date1 <- as.POSIXlt("2016-11-08 01:59:59") #POSIXlt: 日期時間類,精確到秒,用列表表示
date2 <- as.POSIXlt("2016-12-29 12:00:00")
interval(date1, date2)
[1] 2016-11-08 01:59:59 UTC--2016-12-29 12:00:00 UTC
處理日期數據的時候,使用了as.POSIXct函數,但是現在發現一個問題,這個函數貌似不能處理類似於
"%Y-%m-%d %H:%M:%S"的日期格式。
lubridate允許我們在給時間數據賦值的時候加上時區這一項,由於在日常生活中使用可能性較小,這篇文章里就不涉及了。
> int1<-interval(ymd(20161101), ymd(20161103)); int1
有了時間區間的定義,我們還可以判斷一個時間區間是否在另一個時間區間里面,用"%within%"操作符。
> as.period(int1)
[1] "2d 0H 0M 0S"
> int1 / dminutes(1)
[1] 2880
如上還可以查看或計算一個時間區間的長度。
把時間間隔保存為一個lubridate間隔類對象。這是非常有用的哦!
間隔是特定的時間跨度(因為它們依賴於具體日期),但也lubridate提供兩種一般時間跨度類:持續時間和周期。創建期間輔助功能的時間(復數)的單位命名。創建工期的輔助函數遵循相同的格式,但用“D”(持續時間)開始,或者,如果你喜歡,和“e”(有關詳細)。
時間數據運算
此外我們還可以用對時間數據進行加減,這也是很有用的,因為有時候我們要判斷兩個時間之間的間隔是否超過了某個值:
> minutes(2) ## period
[1] "2M 0S"
> dminutes(2) ## duration
[1] "120s (~2 minutes)"
minutes(2)函數表示的2個整分鍾的概念,而dminutes(2)則是具體120秒
dyears(1)表示的365天而years(1)則是一個整年的概念
leap_year()函數可以判斷是否是閏年
> leap_year(2016) #判斷是否是閏年
[1] TRUE
> ymd('20160228')+dyears(1)
[1] "2017-02-27"
> ymd('20160228')+years(1)
[1] "2017-02-28"
矢量
在lubridate代碼矢量,並准備在交互式設置和功能內所使用。舉個例子,我提供了一個功能,推進的日期當月的最后一天last_day <- function(date) {
ceiling_date(date, "month") - days(1) }
####################################
lubridate包主要有兩類函數,一類是處理時點數據(time instants),另一類是處理時段數據(time spans)。有了時點和時段數據,就可以進行各種計算了。
時點類函數,它包括了解析、抽取、修改。
從字符型數據解析時間,會自動識別各種分隔符
> x <- ymd('2016-11-20');x
[1] "2016-11-20"
觀察x日期是一年中的第幾天
> yday(x)
[1] 325
修改x日期中的月份為5月
> month(x) <- 5 ;month(x)
[1] 5
> x
[1] "2016-05-20"
注意點:
時段類函數,它可以處理三類對象,分別是:
interval:最簡單的時段對象,它由兩個時點數據構成。
duration:去除了時間兩端的信息,純粹以秒為單位計算時段的長度,不考慮閏年和閏秒,它同時也兼容基本包中的difftime類型對象。
period:以較長的時鍾周期來計算時段長度,它考慮了閏年和閏秒,適用於長期的時間計算。
從兩個時點生成一個interval時段數據
> x <- ymd('2016-11-20');x
> y <- interval(x,now());y
從interval格式轉為duration格式
> as.duration(y)
時點+時段生成一個新的時點
> now() + as.duration(y)
10天后的時間數據
> now() + ddays(10)
幾個月和幾年的長度常常這樣做算術他們可以直觀的改變。考慮一個簡單的操作,January 31st + one month。如果答案是:
1,February 31st (不存在)
2,March 4th (1月31日以后31天),或
3,February 28th (假設它不是一個閏年)
但它是一個無效的日期。則使lubridate盡可能一致,如果加上或減去一個月或一年創建一個無效的日期,lubridate將返回NA
2或3的解決方案,或使用特殊的%m+%和%m-%。%m+%並%m-%自動回滾可以追溯到一個月的最后一天,應該說是必要的。
jan31 <- ymd("2013-01-31") jan31 + months(0:11)
## [1] "2013-01-31" NA "2013-03-31" NA "2013-05-31" ## [6] NA "2013-07-31" "2013-08-31" NA "2013-10-31" ## [11] NA "2013-12-31"
floor_date(jan31, "month") + months(0:11) + days(31)
## [1] "2013-02-01" "2013-03-04" "2013-04-01" "2013-05-02" "2013-06-01" ## [6] "2013-07-02" "2013-08-01" "2013-09-01" "2013-10-02" "2013-11-01" ## [11] "2013-12-02" "2014-01-01"
jan31 %m+% months(0:11)
## [1] "2013-01-31" "2013-02-28" "2013-03-31" "2013-04-30" "2013-05-31" ## [6] "2013-06-30" "2013-07-31" "2013-08-31" "2013-09-30" "2013-10-31" ## [11] "2013-11-30" "2013-12-31"
請注意,這只會影響使用算術個(和算術多年,如果你的起始日期是2月29日)。