生成2个日期之间的周年日期序列

时间:2018-12-13 01:25:15

标签: r date

我试图生成两个日期之间的日期序列。通过搜索所有旧帖子,我发现使用seq.Date的解决方案非常好。

例如:

> seq.Date(as.Date("2016/1/15"), as.Date("2016/5/1"), by = "month")
[1] "2016-01-15" "2016-02-15" "2016-03-15" "2016-04-15"

上面的函数产生非常好的解决方案。但是,当日期为一月的30或31时,则无效。

> seq.Date(as.Date("2016/1/30"), as.Date("2016/5/1"), by = "month")
[1] "2016-01-30" "2016-03-01" "2016-03-30" "2016-04-30"

第二个周年纪念日跳到3月,而不是2月29日封顶。我找不到解决方法。

2 个答案:

答案 0 :(得分:2)

以下是在其他情况下也适用的方法:

library(lubridate)
fun <- function(from, to, by) {
  mySeq <- seq.Date(as.Date(from), as.Date(to), by = by)
  as.Date(sapply(mySeq, function(d) d + 1 - which.max(day(d - 0:3))), origin = "1970-01-01")
}

fun("2016/1/30", "2016/5/1", "month")
# [1] "2016-01-30" "2016-02-29" "2016-03-30" "2016-04-30"
fun("2017/1/31", "2017/5/1", "month")
# [1] "2017-01-31" "2017-02-28" "2017-03-31" "2017-04-30"
fun("2017/1/29", "2017/5/1", "month")
# [1] "2017-01-29" "2017-02-28" "2017-03-29" "2017-04-29"

fun的作用是从每个日期中减去0:3,然后选择日期最大的日期。

答案 1 :(得分:0)

含润滑包装

library('lubridate')

pmin(
    ymd('2018-01-30') + months(0:11),  # NA where month goes over
    ymd('2018-01-01') + months(1:12) - days(1),  # last day of month
    na.rm = T
)

 [1] "2018-01-30" "2018-02-28" "2018-03-30"
 [4] "2018-04-30" "2018-05-30" "2018-06-30"
 [7] "2018-07-30" "2018-08-30" "2018-09-30"
[10] "2018-10-30" "2018-11-30" "2018-12-30"