Quick question on dates in R. Check out this snippet of code:
Sys.Date() - months(3)
# [1] "2013-12-31"
Sys.Date() - months(18)
# [1] NA
I've loaded the package lubridate
and followed the instructions provided , and I can't quite get my head around this behavior. It used to work just fine, today's the first day that I've noticed that a subtraction of more than 12 months from today's date yields NA
(subtracting less than 12 months works fine).
I'd appreciate if anyone can explain to me why this isn't working, and/or suggest a more "robust" way around it. Does it have something to do with today being the last day of the month (day 31)?
I'm asking because this works:
Sys.Date() - years(2)
# [1] "2012-03-31"
The lubridate
functions %m+%
and %m-%
are designed to handle this issue ("Add and subtract months to a date without exceeding the last day of the new month").
library(lubridate)
Sys.Date() %m-% months(18)
# [1] "2012-09-30"
# or to make it reproducible if Sys.Date() happens to be different from that in OP
as.Date("2014-03-31") %m-% months(18)
# [1] "2012-09-30"
# example of %m+%
as.Date("2014-01-31") + months(1)
# [1] NA
as.Date("2014-01-31") %m+% months(1)
# [1] "2014-02-28"
The solution provides forward months exactly, i.e. 28Feb %m+% gives 28Mar, which is not ideal if working with month end data.
To adjust the top to always give you the last day of the month, use the following code:
ceiling_date((as.Date("2014-02-28") %m+% months(1)),"month")-days(1)
> "2014-03-31"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With