On Apr 18, 2012, at 2:05 PM, Marc Schwartz wrote:

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



Same strategy as Marc used, but I'm thinking his might be returning a factor classed variable and mine it returning a Date class result.

seq(as.Date("2007-06-30", "%Y-%m-%d")+1, to=as.Date("2012-01-31", "%Y- %m-%d")+1,by="3 month" )-1 [1] "2007-06-30" "2007-09-30" "2007-12-31" "2008-03-31" "2008-06-30" "2008-09-30" "2008-12-31" "2009-03-31" [9] "2009-06-30" "2009-09-30" "2009-12-31" "2010-03-31" "2010-06-30" "2010-09-30" "2010-12-31" "2011-03-31"
[17] "2011-06-30" "2011-09-30" "2011-12-31"

--
David.

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

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

David Winsemius, MD
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to