I need to take a vector of dates and for each date get the first day of the next quarter.
(Or rather, to round to the last day of the current quarter, find the first
For any time interval (Annual, Quarterly, Monthly, Weekly), the following function gives the end date, using R base functions (as.POSIXlt and as.Date):
endDate <- function(date, interval) {
date.lt <- as.POSIXlt(date)
switch(interval,
A = {
date.lt$mon = 11
date.lt$mday=31
date=as.Date(date.lt)
},
Q = {
date.lt$mon = (date.lt$mon %/% 3 +1)*3 %% 12
date.lt$mday = 1
date.lt$year = date.lt$year + as.integer(date.lt$mon==0)
date=as.Date(date.lt)-1
},
M = {
date.lt$mon = (date.lt$mon+1) %% 12
date.lt$mday = 1
date.lt$year = date.lt$year + as.integer(date.lt$mon==0)
date=as.Date(date.lt)-1
},
D = {
date = as.Date(date)
},
W = {
date = as.Date(date)+6-date.lt$wday
},
date = as.Date(date$lt)
)
date
}
###
endDate (c("2003-05-21","1945-03-29), "M")
# "2003-05-31" "1945-03-31"
endDate (c("2003-05-21","1945-03-29), "M")
#"2003-06-30" "1945-03-31"
The zoo
package can help for many things date-related including this:
library(zoo)
as.yearqtr("2014-08-15", format="%Y-%m-%d")
## [1] "2014 Q3"
as.Date(as.yearqtr("2014-08-15", format="%Y-%m-%d"))
## [1] "2014-07-01"
But, that might not get you what you need (there are ways to extrapolate from those values).
The timeDate
package has:
timeFirstDayInQuarter(charvec, format = "%Y-%m-%d", zone = "", FinCenter = "")
timeLastDayInQuarter(charvec, format = "%Y-%m-%d", zone = "", FinCenter = "")
which might make it easer to use and tweak to adjust for different Q1 start origins.
I know it’s an old thread but I found my way here from a recent duplicate post.
lubridate::ceiling_date()
now accepts quarters.