[R] quarter end dates between two date strings
Marc Schwartz
marc_schwartz at me.com
Wed Apr 18 20:05:02 CEST 2012
On Apr 18, 2012, at 11:58 AM, Ben quant wrote:
> Hello,
>
> I have two date strings, say "1972-06-30" and "2012-01-31", and I'd like to
> get every quarter period end date between those dates? Does anyone know how
> to do this? Speed is important...
>
> Here is a small sample:
>
> Two dates:
> "2007-01-31"
>
> "2012-01-31"
>
> And I'd like to get this:
>
> [1] "2007-03-31" "2007-06-30" "2007-09-30" "2007-12-31" "2008-03-31"
> "2008-06-30" "2008-09-30" "2008-12-31"
> [9] "2009-03-31" "2009-06-30" "2009-09-30" "2009-12-31" "2010-03-31"
> "2010-06-30" "2010-09-30" "2010-12-31"
> [17] "2011-03-31" "2011-06-30" "2011-09-30" "2011-12-31"
>
>
> Thanks!
>
> ben
First thing that comes to mind is to use cut.Date() with breaks = "quarters" and subtract a day, since it will give you the first day of each quarter by default. See ?cut.Date. It returns a grouped sequence based upon the 'breaks' interval, much like ?cut for a continuous variable, with the factor levels being the grouped values. In this case, the first day of each quarter, which I coerce back to Dates. I remove the first value from the result vector and subtract a day.
Thus, encapsulating it in a function:
Qtrs <- function(Start, End)
{
Vec <- as.Date(levels(cut(seq.Date(Start, End, by = "month"),
breaks = "quarter")))
Vec[-1] - 1
}
> Qtrs(as.Date("2007-01-31"), as.Date("2012-01-31"))
[1] "2007-03-31" "2007-06-30" "2007-09-30" "2007-12-31" "2008-03-31"
[6] "2008-06-30" "2008-09-30" "2008-12-31" "2009-03-31" "2009-06-30"
[11] "2009-09-30" "2009-12-31" "2010-03-31" "2010-06-30" "2010-09-30"
[16] "2010-12-31" "2011-03-31" "2011-06-30" "2011-09-30" "2011-12-31"
Not fully tested, but seems to work, at least with your example dates.
Regards,
Marc Schwartz
More information about the R-help
mailing list