2011-08-31 9 views
7

Estoy extrayendo datos de una base de datos y ejecutando los resultados a través de rehsape2. Por alguna razón, esto está transformando los sellos de fecha y hora de POSIXct en numéricos. No hay problema, creo, puedes simplemente devolverlos, excepto que estoy a una hora de distancia.La conversión de los tiempos de las fechas en POSIXct da un resultado confuso?

Aquí está un ejemplo mínimo

foo<-as.POSIXct("2011-04-04 14:18:58") 
as.numeric(foo)  #gives 130192318 
bar<-as.POSIXct(as.numeric(foo), 
       tz=Sys.timezone(), 
       origin=as.POSIXct(
        strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC"))) 
as.numeric(bar)  #gives 130192318 identical ! 
foo  #Gives "2011-04-04 14:18:58 BST" 
bar  #Gives "2011-04-04 13:18:58 UTC" 

Obviamente foo y bar son numéricamente idénticas, pero piensa R foo necesita ser mostrado como BST y el bar como UTC. ¿Cómo puedo mostrar ambos como BST? Esto tampoco funciona;

as.POSIXct(bar, tz="BST") #still gives "2011-04-04 13:18:58 UTC" 

Respuesta

13

Esto es lo que está pasando. bar se crea utilizando as.POSIXct.numeric, que se define como:

as.POSIXct.numeric 
function (x, tz = "", origin, ...) 
{ 
    if (missing(origin)) 
     stop("'origin' must be supplied") 
    as.POSIXct(origin, tz = tz, ...) + x 
} 
<environment: namespace:base> 

usted suministra un origen que es un objeto POSIXct. Eso significa que la llamada as.POSIXct en as.POSIXct.numeric despachos a as.POSIXct.default, que se define como:

as.POSIXct.default 
function (x, tz = "", ...) 
{ 
    if (inherits(x, "POSIXct")) 
     return(x) 
    if (is.character(x) || is.factor(x)) 
     return(as.POSIXct(as.POSIXlt(x, tz, ...), tz, ...)) 
    if (is.logical(x) && all(is.na(x))) 
     return(.POSIXct(as.numeric(x))) 
    stop(gettextf("do not know how to convert '%s' to class \"POSIXct\"", 
     deparse(substitute(x)))) 
} 
<environment: namespace:base> 

x es un objeto POSIXct clase (la origin que ha proporcionado en la llamada inicial), por lo que se devuelve de forma sencilla y el argumento tz= es ignorado


ACTUALIZACIÓN:
Así es como se puede convertir de nuevo a fooPOSIXct con la zona horaria correspondiente.

(foo <- as.POSIXct("2011-04-04 14:18:58", tz="GB")) 
# [1] "2011-04-04 14:18:58 BST" 
.POSIXct(as.numeric(foo), tz="GB") 
# [1] "2011-04-04 14:18:58 BST" 
+1

+1 Por mostrar lo que está pasando – Andrie

+1

Brilliant. Gracias por agregar tu actualización. – PaulHurleyuk

2

Aquí está el cliché que he empleado para evitar esto. Al especificar el origen como la hora actual menos la versión numérica de la hora actual, las zonas horarias no parecen confundirse.

foo<-as.POSIXct("2011-04-04 14:18:58") 
as.numeric(foo)  #gives 130192318 
bar<-as.POSIXct(as.numeric(foo), tz="GB", origin=Sys.time()-as.numeric(Sys.time())) 
as.numeric(bar)  #gives 130192318 identical ! 
foo  #Gives "2011-04-04 14:18:58 BST" 
[1] "2011-04-04 14:18:58 BST" 
bar  #Gives "2011-04-04 14:18:58 BST" 
[1] "2011-04-04 14:18:58 BST 
+0

No entendí lo que quería. He actualizado mi respuesta con una solución que puede encontrar menos caprichoso. –

Cuestiones relacionadas