[Rd] suggestions re trunc.POSIXt

Kenn Konstabel lebatsnok at gmail.com
Wed Mar 23 20:21:32 CET 2011


Dear all,

I hope this is a right place to post this; r-help might be appropriate
but it looks like I'm suggesting a change in base package, so I
decided to post here. (+ Apologies if that has been changed recently
-- the version I'm using is R.2.12.2 on Windows.)

I've noticed an unexpected behavior of trunc.POSIXt:

foo <- seq(as.POSIXct( "2009-10-23 22:00:00"), as.POSIXct("2009-10-26
22:00:00"), by="6 hours")
bar <- trunc(foo, "days")

Now class(bar)[1] returns "POSIXlt" although foo is POSIXct, and then
comes the following surprise:

length(foo)    # 13
length(as.POSIXlt(foo))  # still 13
length(bar)   # 1
length(as.POSIXct(bar))  # again 13

It would be nice if trunc would preserve the class as POSIXct, for
example, using
 trunc.POSIXct <- function(x, ...) as.POSIXct(trunc.POSIXt(x,...))

On the other hand, I noticed that

> sapply(bar, length)
#  sec   min  hour  mday   mon  year  wday  yday isdst
#   1     1     1    13    13    13    13    13     1

So trunc makes the first three elements shorter which also breaks
`[.POSIXlt` . This is also the reason why length(bar) returns 1 as it
just uses the length of first element. So I'd suggest changig this
too, replacing the lines like  x$sec <- 0  by x$sex[] <- 0 (the second
version would preserve the number of elements). (Changed version at
the end). It doesn't seem like this change could possibly break any
existing code.


Best regards,
Kenn

Kenn Konstabel
Department of Chronic Diseases
National Institute for Health Development
Hiiu 42
Tallinn, Estonia


######

trunc.POSIXt <- function (x, units = c("secs", "mins", "hours", "days"), ...)
{
# changed x$sec <- 0 to x$sec[]<-0 to preserve the number of elements
    units <- match.arg(units)
    x <- as.POSIXlt(x)
    if (length(x$sec))
        switch(units, secs = {
            x$sec <- trunc(x$sec)
        }, mins = {
            x$sec[] <- 0
        }, hours = {
            x$sec[] <- 0
            x$min[] <- 0L
        }, days = {
            x$sec[] <- 0
            x$min[] <- 0L
            x$hour[] <- 0L
            x$isdst <- -1L
        })
    x
}



More information about the R-devel mailing list