Search code examples
rdatesequencelubridate

Create a Vector of All Days Between Two Dates


Is there an easy way in R for me to itemize all valid days that occurred between two specified dates? For instance, I'd like the following inputs:

itemizeDates(startDate="12-30-11", endDate="1-4-12")

To produce the following dates:

"12-30-11" "12-31-11", "1-1-12", "1-2-12", "1-3-12", "1-4-12"

I'm flexible on classes and formatting of the dates, I just need an implementation of the concept.


Solution

  • You're looking for seq

    > seq(as.Date("2011-12-30"), as.Date("2012-01-04"), by="days")
    [1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
    [6] "2012-01-04"
    

    Or, you can use :

    > as.Date(as.Date("2011-12-30"):as.Date("2012-01-04"), origin="1970-01-01")
    [1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
    [6] "2012-01-04"
    

    Note that with : "Non-numeric arguments are coerced internally". Thus, we convert back to class Date, using as.Date method for class 'numeric' and provide origin.


    Here's a function to meet your specific request

    itemizeDates <- function(startDate="12-30-11", endDate="1-4-12", 
                             format="%m-%d-%y") {
      out <- seq(as.Date(startDate, format=format), 
                 as.Date(endDate, format=format), by="days")  
      format(out, format)
    }
    
    > itemizeDates(startDate="12-30-11", endDate="1-4-12")
    [1] "12-30-11" "12-31-11" "01-01-12" "01-02-12" "01-03-12" "01-04-12"