[R] Processing dates and generating sequences of dates

Gavin Simpson gavin.simpson at ucl.ac.uk
Mon Feb 4 16:39:55 CET 2008


hits=-2.6 tests=BAYES_00
X-USF-Spam-Flag: NO

Dear List,

Say I have the following sequence of dates [*]:

start <- as.Date("2005-01-05", format = "%Y-%d-%m")
end <- as.Date("2007-10-07", format = "%Y-%d-%m")
my.dates <- seq(start, end, by = "days")

What I would like to generate is a sequence of dates, by month that goes
from the first day of 2005 (the year of the start date) to the last day
of 2007 (the year of the end date), so that the output is a vector of 36
dates containing all months of the three calendar years that the
sampling spanned.

I could do it via manipulation of dates as so:

new.dates <- seq(as.Date(paste(format(min(my.dates), format = "%Y"), 
                               "1", "1", sep = "/")),
                 as.Date(paste(format(max(my.dates), format = "%Y"), 
                               "12", "31", sep = "/")),
                 by = "months")

And then manipulate that to get only the month and year parts of the 36
generated dates.

This doesn't seem very elegant to me. Is there a better/easier way than
converting back and forth between characters and objects of class
"Date"?

Many thanks,

G

[*] FWIW, my actual application is similar to my.dates, but not sampled
every day - indeed there are months where there are no samples - and I
am trying to do a levelplot of the numbers of observations per month,
per year. Given the following data

dat <- data.frame(temp = rnorm(length(my.dates)),
                  my.dates = my.dates)
dat$year <- as.numeric(format(dat$my.dates, format = "%Y"))
dat$month <- format(dat$my.dates, format = "%b")
dat$month <- factor(dat$month, levels = c("Jan","Feb","Mar","Apr",
                                          "May","Jun","Jul","Aug",
                                          "Sep","Oct","Nov","Dec"))

I can get a table of the number of observations per month per year via

(obs.yearmon <- with(dat, table(year, month)))

Which when converted to a vector provides what I need for levelplot()'s
formula method. Now I just need to generate the sequence of 36 months
("Jan", "Feb" etc) and years to go with it. The matrix method of
levelplot works, but I am having to hard code a lot of details that I
believe the formula method will handle automagically for me.
-- 
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
 Dr. Gavin Simpson             [t] +44 (0)20 7679 0522
 ECRC, UCL Geography,          [f] +44 (0)20 7679 0565
 Pearson Building,             [e] gavin.simpsonATNOSPAMucl.ac.uk
 Gower Street, London          [w] http://www.ucl.ac.uk/~ucfagls/
 UK. WC1E 6BT.                 [w] http://www.freshwaters.org.uk
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%



More information about the R-help mailing list