从2月开始的日期增加6个月

时间:2019-04-02 22:19:53

标签: r lubridate

我正在尝试使用lubridate库从2月份减去3个月的日期,但是,它始终使我的日期为28。我知道很多人都问过这个问题,但是我尝试了很多事情,但是还是一样的错误。循环一天是一种选择。但是,我一直在寻找有效的方法

我的代码是这样的:

其中test_end =“ 2019-02-28” 并且lastnmonth = 3

as.Date(test_end) %m-% months(lastnmonth)

我总是将输出显示为“ 2018-11-28”,而不是“ 2018-11-30”

3 个答案:

答案 0 :(得分:0)

lubridate::ymd("2019-02-28") - lubridate::period(3, "months")

锻炼mont-end的其他代码

lubridate::ceiling_date(lubridate::ymd("2019-02-28") - lubridate::period(3, "months"), "months") - lubridate::ddays(1)

答案 1 :(得分:0)

您想要一个月的最后一个月-因此您可以使用 next 首先的技巧,将其移动几个月,然后减去一天。

全部位于基数R的一行:

R> seq(as.Date("2019-02-28") + 1, length=4, by="-1 month") - 1
[1] "2019-02-28" "2019-01-31" "2018-12-31" "2018-11-30"
R> 

我们添加一天,然后使用四个月(包括当期)的顺序倒数,然后减去上个月最后一天的一天。

如果只想要一个,只需添加tail(..., 1)

R> tail(seq(as.Date("2019-02-28") + 1, length=4, by="-1 month") - 1, 1)
[1] "2018-11-30"
R> 

答案 2 :(得分:0)

使用Dirk的策略,我们可以绘制一个函数来处理此类操作:

start_date       <- lubridate::ymd("2019-02-28")
mths_to_subtract <- 3


deduct_mth <- function(date_object = start_date, 
                       mths_to_deduct = mths_to_subtract){

  days_to_ceiling_date <- lubridate::ceiling_date(date_object, "months") - date_object

  date_object + days_to_ceiling_date - lubridate::period(mths_to_deduct, "months") - days_to_ceiling_date

}

给出以下答案:

> deduct_mth(ymd("2019-02-28"), 3)
[1] "2018-11-30"
> deduct_mth(ymd("2000-02-29"), 3)
[1] "1999-11-30"