R日期与lubridate


76

嗨,我正在尝试获取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')

绝招


谢谢@shujaa mnel在那里提供了有用的详细说明。
Tahnoon Pasha

Answers:


87

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)))

有什么方法可以获取POSIXct格式化对象序列吗?我想将日期序列用于自定义x轴,并且POSIXt与绘图数据不匹配(全部来自lubridate输出的POSIXct)。
rrr

请注意,基本R方法并不总是与lubridate的Period相同。seq(as.Date("2001-01-31"), as.Date("2001-12-31"), "months")例如,给出令人惊讶的结果。
dash2

6

这是一种方法来坚持内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"

常规+有时也会起作用,但是%m+%可以防止出现以下错误:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.