您好我正在尝试使用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')
技巧
答案 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
的方法。我避免在脚本中更改日期格式,因为我发现它是引入错误(例如时区更改或丢失时间戳)的常见地方。遵循以下建议使用POSIXt
:R: 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”不代表“月份增加”。我最好的猜测是“魔术” =)