R序列的日期与lubridate

时间:2013-06-05 05:24:23

标签: r lubridate

您好我正在尝试使用lubridate获取一系列日期

这不起作用

seq(ymd('2012-04-07'),ymd('2013-03-22'),by=week(1))

基本命令

seq(as.Date('2012-04-7'),as.Date('2013-03-22'),'weeks')

确实如此,但我想知道是否有一种优雅的方法可以使用lubridate。

修改

请忽略:解决了我自己所以只留下子孙后代。很高兴在必要时将其删除。

seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')

技巧

2 个答案:

答案 0 :(得分:57)

ymd是一个解析日期字符串并返回POSIXct对象的包装器。

您只需使用?seq.POSIXt(不是lubridate)中描述的标准术语来定义周

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '1 week')
seq(ymd('2012-04-07'),ymd('2013-03-22'), by = 'weeks')

将有效

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '2 week')

您可以将lubridate Period类对象强制转换为difftime,但这似乎是不必要的

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = as.difftime(weeks(1)))

答案 1 :(得分:2)

这是一种坚持在POSIXct的{​​{1}}范围内并且不将日期格式更改为以R为基础的lubridate的方法。我避免在脚本中更改日期格式,因为我发现它是引入错误(例如时区更改或丢失时间戳)的常见地方。遵循以下建议使用POSIXtR: adding 1 month to a date

%m+%

常规# example date is a leap day for a "worst case scenario" library("lubridate") posixct.in <- parse_date_time(x = "2016-02-29", orders = "ymd") # [1] "2016-02-29 UTC" posixct.seq <- posixct.in %m+% years(x = seq.int(from = 0, to = 3, by = 1)) # [1] "2016-02-29 UTC" "2017-02-28 UTC" "2018-02-28 UTC" "2019-02-28 UTC" posixct.seq <- posixct.in %m+% months(x = seq.int(from = 0, to = 3, by = 1)) # [1] "2016-02-29 UTC" "2016-03-29 UTC" "2016-04-29 UTC" "2016-05-29 UTC" posixct.seq <- posixct.in %m+% days(x = seq.int(from = 0, to = 3, by = 1)) # [1] "2016-02-29 UTC" "2016-03-01 UTC" "2016-03-02 UTC" "2016-03-03 UTC" posixct.seq <- posixct.in %m+% weeks(x = seq.int(from = 0, to = 3, by = 1)) # [1] "2016-02-29 UTC" "2016-03-07 UTC" "2016-03-14 UTC" "2016-03-21 UTC" 有时也可以使用,但是+可以防止出现以下错误:

%m+%

起初我很困惑,因为我认为posixct.seq <- posixct.in + years(x = seq.int(from = 0, to = 3, by = 1)) # [1] "2016-02-29 UTC" NA NA NA 只是增加月份的一种方法,而类似的%m+lubridate命令并不存在。但是,事实证明,“ m”不代表“月份增加”。我最好的猜测是“魔术” =)