我希望用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个月的月份,然后知道哪一天应该最终取决于月份。
有没有办法快速纠正这个?目前,我正在构建一个基本上使用开关的功能,并考虑每个月,但这很长,我也遇到问题。
谢谢!
答案 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)
}
}
注意:未调试,请自行检查并告知我们。