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

Add 6 months to a date starting february

我正在尝试使用 lubridate 库从二月减去 3 个月到一个日期,但是,它总是给我 28 的日期。我知道很多人都问过这个问题,但我已经尝试了很多东西,但仍然是同样的错误。循环一天是一种选择。但是,我一直在寻找高效的东西

我的代码是这样的:

其中 test_end = "2019-02-28" 和 lastnmonth = 3

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

我总是得到“2018-11-28”而不是“2018-11-30”的输出

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)

你想要这个月的最后一个 - 所以你可以使用 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> 

使用 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"