带润滑油的日期序列

嗨,我想要一系列有润滑剂的日期

这不管用

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

基地指挥部

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

是的,但是我想知道有没有一种优雅的方法来处理润滑剂。

剪辑

请忽略: 解决了自己的问题,留给后人吧。如果有必要的话,我很乐意把这个删掉。

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

有用

49450 次浏览

ymd is a wrapper to parse date strings and returns a POSIXct object.

You simply need to use standard terminology described in ?seq.POSIXt (not lubridate) to define weeks

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

will works

as will

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

You could coerce the lubridate Period class object to a difftime, but that seems rather unnecessary

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

This is a way to stick within the POSIXct universe of lubridate and not change date formats to base R's POSIXt. I avoid changing the date format in my scripts because I find it is a common place where bugs (for example time-zone changes or losing timestamps) are introduced. It follows this advice to use %m+%: R: adding 1 month to a date

# 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"

A regular + also works sometimes, but the %m+% prevents errors like this:

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

At first I was confused because I thought %m+ was just a way to add months, and similar lubridate commands like %y+% etc. do not exist. But, turns out the "m" doesn't stand for "month addition". My best guess is "magic" =)