[Rd] timezone attribute lost

William Dunlap wdunlap at tibco.com
Mon Nov 24 18:36:18 CET 2008


> From: r-devel-bounces at r-project.org 
> [mailto:r-devel-bounces at r-project.org] On Behalf Of Thomas Mang
> Sent: Monday, November 24, 2008 1:02 AM
> To: r-devel at stat.math.ethz.ch
> Subject: [Rd] timezone attribute lost
> 
> Hi,
> 
> As I didn't get any response on the general help list and I 
> don't know 
> if there is a bug in action I am trying my luck here.
> 
> I was highly surprised to find out that during simple operations (see 
> code below) the timezone attribute for POSIXct data is lost and then, 
> upon the next interpretation, the system settings are used (which are 
> plain wrong in my case).
> 
> I have used R 2.8.0 under Windows XP with the system timezone 
> (managed 
> by Windows) set to CET - I suppose however that all other timezones, 
> with the exception of GMT, will show similiar surprising 
> behavior (and 
> those who live in GMT-zone: If you change your timezone 
> setting please 
> restart R, otherwise the effect won't take place).
> 
> 
> # input data
> # note that the timezone is deliberately set to GMT, and of course I 
> want the operations below to take place in GMT-time
> Time = as.POSIXct(strptime(c("2007-12-12 14:30:15", "2008-04-14 
> 15:31:34", "2008-04-14 15:31:34"), format = "%Y-%m-%d %H:%M:%S", tz = 
> "GMT"))
> Time  # OK, time zone is GMT
> attr(Time, "tzone")  # OK, time zone is GMT
> 
> 
> # Surprise 1:
> TApply = tapply(1:3, Time, max)
> names(TApply) # wrong, names are converted to time zone of system
> 
> # Surprise 2:
> UTime = unique(Time)
> UTime  # wrong, again time zone of system is used
> attr(UTime, "tzone")  # == NULL
> 
> 
> I know how to "solve" the problem (for example by setting an R system 
> variable TZ to GMT), but I wonder why is this mess happening at all? 
> Moreover, is this behavior considered to be a feature, or a 
> plain bug ?

All of those problems are due to a problem in unique.default(), which
sends
the integer data in POSIXct, Date, and factor objects through a
.Internal
and then tries to reconstruct the original sort of object from the
integer output of that .Internal()
    z <- .Internal(unique(x, incomparables, fromLast))
    if (is.factor(x))
        factor(z, levels = seq_len(nlevels(x)), labels = levels(x),
            ordered = is.ordered(x))
    else if (inherits(x, "POSIXct") || inherits(x, "Date"))
        structure(z, class = class(x))

Your immediately problem could be solved by adding tzone=attr(x,"tzone")
to the structure call, but I'm not familiar enough with classes
inheriting
from POSIXct and Date to know if that is sufficient.  There is no reason
someone won't make a new subclass where another attribute is essential.
Since .Internal used the equivalent of as.numeric(x) to extract numeric
codes,
it might be nice to have an as.numeric<-(x,value) function that could
insert
numeric codes back into a dataset so you could avoid reconstructing an
object
of unknown structure with as.numeric(x)<-z (or perhaps as.vector<-
should
be used so you don't have to know what the integer type is).  In S and
S+
one can use x at .Data<-newNumericCodes for this sort of thing, but that
can
be dangerous because it lets you stick in inappropriate types.
 
One might think that adding a new unique method for POSIXct or Date or
things
subclassed from them would be the right way to structure things, but
factor()
explicitly calls unique.default().
 
> Thanks,
> Thomas
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 

Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com 



More information about the R-devel mailing list