使用lubridate在R中加/减6个月(键合时间)

时间:2014-03-25 08:22:02

标签: r date lubridate

我希望用lubridate可靠地加减6个月。

例如,向12/31/2014添加六个月会产生6/30/2015, 添加到2/28/2014应该会产生8/31/2014

as.Date("2014-12-31") + months(6)的问题在于它会产生NA。或者,第二个结果是8/28/2014,因为它不会仅仅增加6个月的月份,然后知道哪一天应该最终取决于月份。

有没有办法快速纠正这个?目前,我正在构建一个基本上使用开关的功能,并考虑每个月,但这很长,我也遇到问题。

谢谢!

2 个答案:

答案 0 :(得分:50)

lubridate函数%m+%在这里可能很有用:

  

在不超过新月最后一天的日期添加和减去月份

as.Date("2014-12-31") %m+% months(6)
# [1] "2015-06-30"

要处理第二种情况,您需要使用ceiling_date向上舍入到最近的月份,并使用days减去一天。

ceiling_date(as.Date("2014-02-28") %m+% months(6), unit = "month") - days(1)
# [1] "2014-08-31"

答案 1 :(得分:1)

我只是快速编写了这个,但我认为它应该有效。但是,我不确定它是否是最优雅的解决方案。

# up = 1, down = -1
six.mo.mover<-function(date,up.or.down) {
  last.day <- month(date) != month(as.Date(date)+1) 
  if(last.day) {
    adj.date <- as.Date(date) - day(as.Date(date)-1) + up.or.down*months(6)
    adj.mo <- month(adj.date)
    if (adj.mo == 2) {
      dy <- 28 + leap_year(year(adj.date))
    }
    else {
      dy <- 31-(adj.mo-1)%%7%%2
    }
    adj.date + days(dy-1)
  } 
  else {
    as.Date(date)+up.or.down*months(6)
  }
}

注意:未调试,请自行检查并告知我们。