From lebatsnok at gmail.com  Wed Mar 23 20:21:32 2011
From: lebatsnok at gmail.com (Kenn Konstabel)
Date: Wed, 23 Mar 2011 19:21:32 +0000
Subject: [Rd] suggestions re trunc.POSIXt
Message-ID: <AANLkTinfd3jcNLTaz9Fb7wYP5=zEHUY3TK8XZN_Ho9FG@mail.gmail.com>

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
}



[Rd] suggestions re trunc.POSIXt
Kenn Konstabel