[R] quarter end dates between two date strings

David Winsemius dwinsemius at comcast.net
Wed Apr 18 20:49:53 CEST 2012


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 at 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



More information about the R-help mailing list