Gavin Simpson
2008-Feb-04 15:39 UTC
[R] Processing dates and generating sequences of dates
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 %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
Gabor Grothendieck
2008-Feb-04 15:48 UTC
[R] Processing dates and generating sequences of dates
Using zoo's yearmon class: library(zoo) my.dates[!duplicated(as.yearmon(my.dates))] or, although you seem to disallow this in your question, this would be an option: my.dates[!duplicated(format(my.dates, "%Y-%m"))] On Feb 4, 2008 10:39 AM, Gavin Simpson <gavin.simpson at ucl.ac.uk> wrote:> 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 > %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% > > ______________________________________________ > 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. >