# [R] Truncating dates (and other date-time manipulations)

Fri Sep 12 04:22:11 CEST 2008

```>> I don't think that cut.Date helps because I want to make a new series,
>> not divide up an existing one, similarly with to.period.  as.yearmon,
>
> Use cut.Date like this (assuming the dates variable as in your post):
>
> r <- as.Date(cut(range(dates), "month"))
>
>
> # every month
> seq(r[1], r[2]+32, "month")

Thanks for that hint:

floor.Date <- function(date, time) {
as.Date(cut(date, time))
}

ceiling.Date <- function(date, time) {
parts <- strsplit(time, " ")[[1]]
if (length(parts) == 1) {
mult <- 1
unit <- time
} else {
mult <- as.numeric(parts[[1]])
unit <- parts[[2]]
}
unit <- gsub("s\$", "", unit)

up <- c("day" = 1, "week" = 7, "month" = 31, "year" = 365)
date <- date + mult * up[unit]

floor.Date(date, time)
}

which does what I want, I think - accepting all unit specifications
that seq.Date and cut.Date do.  I guess I'll just include these
functions in ggplot2, even though it seems like there should be a more
suitable home for them.

>> as.yearqtr etc, might be helpful but I'd need to stitch them together
>> myself and they don't return dates so I'd have to convert back for
>> plotting.   plot.zoo doesn't help because all the examples are regular
>
> Also both yearmon and yearqtr can be used for plotting -- you don't
> have to convert them back to Dates just for plotting as zoo provides
> axis.yearmon and axis.yearqtr and furthermore there is no assumption
> of regular series needed.
>
> plot(as.yearmon(Sys.Date()) + c(0, 5, 7, 20)/12, 1:4)

I think you miss the point that this is for ggplot2, so that using
plotting primitives from other packages is rather beside the point.

> Although in all these examples you do have to combine several functions,
> if there were a function for every conceivable date manipulation there
> would be too large a number to remember and its better to have a good
> set of primitives that are sufficiently powerful that most operations can
> be done in one or two lines as shown above.

That's exactly what I'm arguing - I feel like your argument is the
equivalent to saying that we don't need floor and ceiling for numbers
because we have cut.