Lubridate--Do more with dates and times in R

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 = "Pacific/Auckland")#tz参数中提供该时区的名称,用于读取带有特定时区的日期
arriveleave <- ymd_hms("2011-08-10 14:00:00", tz = "Pacific/Auckland")#设置太平洋地区的时间为2011-08-10 14:00:00 NZST
leave

在这里插入图片描述

Setting and Extracting information设置和提取日期

从日期时间中提取信息,函数为 second, minute, hour, day, wday, yday, week, month, year, tz。
还可以使用其中的每一个来设置(即更改)给定的信息。这将改变日期时间。
Wday和month有一个可选的label参数,该参数将它们的数字输出替换为工作日或月份的名称。

second(arrive)#arrive中的秒数提取second(arrive) <- 25#设置到达时间的秒数,这会对arrive进行修改
arrivesecond(arrive) <- 0wday(arrive)wday(arrive, label = TRUE)#可选的label参数,该参数将它们的数字输出替换为工作日或月份的名称。

在这里插入图片描述

Time Zones时区

关于日期和时区有两件非常有用的事情。
首先,在不同的时区显示相同的时刻。
第二,通过将现有的时钟时间与新时区相结合来创建一个新的时刻。
这些是通过with_tz和force_tz完成的。

# 举例说明,如果是从太平洋的时间变成美国芝加哥的时间是多少
meeting <- ymd_hms("2011-07-01 09:00:00", tz = "Pacific/Auckland")
with_tz(meeting, "America/Chicago")#如果是从美国芝加哥的时间变成太平洋的时间是多少
mistake <- force_tz(meeting, "America/Chicago")
with_tz(mistake, "Pacific/Auckland")

在这里插入图片描述

Time Intervals 时间区间

可以将时间区间保存为lubridate的interval类对象中

#求解arrive和leave时间的区间
auckland <- interval(arrive, leave)
aucklandauckland <- arrive %--% leave
auckland

在这里插入图片描述

jsm <- interval(ymd(20110720, tz = "Pacific/Auckland"), ymd(20110831, tz = "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是特定的时间跨度,有两个具体时间的时间跨度。
lubridate也提供了两个一般的时间跨度类:duration和Periods。
“d”:表示持续时间,用于开头
“e”:表示确切时间。

minutes(2) ## period
#> [1] "2M 0S"
dminutes(2) ## duration,“d”:表示持续时间,用于开头
#> [1] "120s (~2 minutes)"

在这里插入图片描述
Duration类提供数学上精确的结果。Duration的一年总是等于365天。
为了给出直观的结果,Duration与时间轴的波动方式相同。这使得它们对时钟时间建模很有用。
例如,在闰年的时候,duration是会给出真实时间,但是period可能会返回你想要的结果,直接变成下一年的日期

leap_year(2011) ## regular yearymd(20110101) + dyears(1)ymd(20110101) + years(1)leap_year(2012) ## leap year闰年ymd(20120101) + dyears(1)
#>给出真实的时间
ymd(20120101) + years(1)
#给出你想要的结果

在这里插入图片描述

meetings <- meeting + weeks(0:5)#加上固定的时间,重复计算
meetings
meetings %within% jsm#是否在jsm的时间段内

在这里插入图片描述

auckland / ddays(1)#计算时间长度,几天
#> [1] 67.08333
auckland / ddays(2)#计算时间长度,以两天为单位
#> [1] 33.54167
auckland / dminutes(1)#计算时间长度,几分钟
#> [1] 96600

在这里插入图片描述

auckland %/% months(1)
#时间间隔与一个月相除,即表示时间间隔中有几个月
auckland %% months(1)
#时间间隔与一个月相除后的余数是多少

在这里插入图片描述

#将上面的计算结果进行标准化的输出
as.period(auckland %% months(1))
#> [1] "6d 2H 0M 0S"
as.period(auckland)
#> [1] "2m 6d 2H 0M 0S"

在这里插入图片描述
时间计算中可能会出现一些冲突或者错误
举例:
January 31st + one month
结果可能为February 31st 根本不存在。March 4th ( January 31的后31天), or February 28th (如果是闰年的话)
这种就会出现多个结果,为了统一,提供以下解决方法。
如果想要结果为February 31st (根本不存在的时间)如果时间不存在,就返回na。以下是新版本version 1.3.0。
如果想要的结果是March 4th ( January 31的后31天), or February 28th (如果是闰年的话),就使用特定的操作方式l %m+%

jan31 <- ymd("2013-01-31")
jan31 + months(0:11)floor_date(jan31, "month") + months(0:11) + days(31)jan31 %m+% months(0:11)

在这里插入图片描述

Vectorization向量化

lubridate中的代码是向量化的,可以在交互和函数中使用

last_day <- function(date) {ceiling_date(date, "month") - days(1)
}
#用于实现计算这个月的最后天x<-ymd("20110604")
last_day(x)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部