R序列的日期与lubridate

Tah*_*sha 57 r lubridate

嗨,我正在尝试用lubridate获取一系列日期

这不起作用

seq(ymd('2012-04-07'),ymd('2013-03-22'),by=week(1))
Run Code Online (Sandbox Code Playgroud)

基本命令

seq(as.Date('2012-04-7'),as.Date('2013-03-22'),'weeks')
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否有一种优雅的方式与lubridate这样做.

编辑

请忽略:解决自己,所以只留下后人.很高兴在必要时将其删除.

seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')
Run Code Online (Sandbox Code Playgroud)

诀窍

mne*_*nel 66

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')
Run Code Online (Sandbox Code Playgroud)

会有效的

一如既往

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '2 week')
Run Code Online (Sandbox Code Playgroud)

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

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

  • 需要注意的是,基本 R 方法并不总是与 lubridate 的 period 具有相同的效果。例如, `seq(as.Date("2001-01-31"), as.Date("2001-12-31"), "months")` 给出了令人惊讶的结果。 (2认同)

rrr*_*rrr 8

这是一种方法来坚持内POSIXct的宇宙lubridate,而不是更改日期格式的基础R的POSIXt。我避免更改脚本中的日期格式,因为我发现这是引入错误(例如时区更改或丢失时间戳)的常见地方。它遵循以下建议使用%m+%R:向日期添加 1 个月

# 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"
Run Code Online (Sandbox Code Playgroud)

常规+有时也有效,但%m+%可以防止这样的错误:

posixct.seq <- posixct.in + years(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" NA               NA               NA
Run Code Online (Sandbox Code Playgroud)

起初我很困惑,因为我认为%m+这只是增加月份的一种方式,并且不存在lubridate诸如此类的类似命令%y+%。但是,事实证明“m”并不代表“月份加法”。我最好的猜测是“魔法”=)