Lubridate是一个R包,可以更容易地处理日期和时间。
https://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html
Parsing dates and times解析日期
lubridate可以解析日期,按照y、m、d(在日期中出现的顺序进行提取,简化标准化日期的过程。
library(lubridate)ymd("20110604")mdy("06-04-2011")dmy("04/06/2011")
Lubridate的解析函数可以处理各种格式和分隔符,这简化了解析过程。
如果日期包含时间信息,在函数的名字后面加上h, m,和/或s。
Ymd_hms是最常见的日期时间格式。
要读取带有特定时区的日期,在tz参数中提供该时区的正式名称。
arrive <- ymd_hms("2011-06-04 12:00:00", tz &#61; "Pacific/Auckland")
arriveleave <- ymd_hms("2011-08-10 14:00:00", tz &#61; "Pacific/Auckland")
leave
Setting and Extracting information设置和提取日期
从日期时间中提取信息&#xff0c;函数为 second, minute, hour, day, wday, yday, week, month, year, tz。
还可以使用其中的每一个来设置(即更改)给定的信息。这将改变日期时间。
Wday和month有一个可选的label参数&#xff0c;该参数将它们的数字输出替换为工作日或月份的名称。
second(arrive)second(arrive) <- 25
arrivesecond(arrive) <- 0wday(arrive)wday(arrive, label &#61; TRUE)
Time Zones时区
关于日期和时区有两件非常有用的事情。
首先&#xff0c;在不同的时区显示相同的时刻。
第二&#xff0c;通过将现有的时钟时间与新时区相结合来创建一个新的时刻。
这些是通过with_tz和force_tz完成的。
meeting <- ymd_hms("2011-07-01 09:00:00", tz &#61; "Pacific/Auckland")
with_tz(meeting, "America/Chicago")
mistake <- force_tz(meeting, "America/Chicago")
with_tz(mistake, "Pacific/Auckland")
Time Intervals 时间区间
可以将时间区间保存为lubridate的interval类对象中
auckland <- interval(arrive, leave)
aucklandauckland <- arrive %--% leave
auckland
jsm <- interval(ymd(20110720, tz &#61; "Pacific/Auckland"), ymd(20110831, tz &#61; "Pacific/Auckland"))
jsm
int_overlaps(jsm, auckland)
setdiff(auckland, jsm)
intervals的其他功能int_start, int_end, int_flip, int_shift, int_aligns, union, intersect, setdiff, %within%.
Arithmetic with date times有关时间的计算
Intervals是特定的时间跨度&#xff0c;有两个具体时间的时间跨度。
lubridate也提供了两个一般的时间跨度类:duration和Periods。
“d”&#xff1a;表示持续时间&#xff0c;用于开头
“e”&#xff1a;表示确切时间。
minutes(2)
dminutes(2)
Duration类提供数学上精确的结果。Duration的一年总是等于365天。
为了给出直观的结果&#xff0c;Duration与时间轴的波动方式相同。这使得它们对时钟时间建模很有用。
例如&#xff0c;在闰年的时候&#xff0c;duration是会给出真实时间&#xff0c;但是period可能会返回你想要的结果&#xff0c;直接变成下一年的日期
leap_year(2011) ymd(20110101) &#43; dyears(1)ymd(20110101) &#43; years(1)leap_year(2012) ymd(20120101) &#43; dyears(1)
ymd(20120101) &#43; years(1)
meetings <- meeting &#43; weeks(0:5)
meetings
meetings %within% jsm
auckland / ddays(1)
auckland / ddays(2)
auckland / dminutes(1)
auckland %/% months(1)
auckland %% months(1)
as.period(auckland %% months(1))
as.period(auckland)
时间计算中可能会出现一些冲突或者错误
举例&#xff1a;
January 31st &#43; one month
结果可能为February 31st 根本不存在。March 4th ( January 31的后31天), or February 28th (如果是闰年的话)
这种就会出现多个结果&#xff0c;为了统一&#xff0c;提供以下解决方法。
如果想要结果为February 31st &#xff08;根本不存在的时间&#xff09;如果时间不存在&#xff0c;就返回na。以下是新版本version 1.3.0。
如果想要的结果是March 4th ( January 31的后31天), or February 28th (如果是闰年的话)&#xff0c;就使用特定的操作方式l %m&#43;%
jan31 <- ymd("2013-01-31")
jan31 &#43; months(0:11)floor_date(jan31, "month") &#43; months(0:11) &#43; days(31)jan31 %m&#43;% months(0:11)
Vectorization向量化
lubridate中的代码是向量化的&#xff0c;可以在交互和函数中使用
last_day <- function(date) {ceiling_date(date, "month") - days(1)
}
x<-ymd("20110604")
last_day(x)