2010-03-16 10 views
18

¿Por qué veo una diferencia cuando convierto un sello de fecha y hora de unix en un objeto datetime en R?Conversión de segundos de Unix en milisegundos en POSIXct/POSIXlt

> as.POSIXlt(1268736919, origin="1970-01-01", tz="America/New_York") 
[1] "2010-03-16 06:55:19 EDT" 

> as.POSIXct(1268736919, origin="1970-01-01", tz="America/New_York") 
[1] "2010-03-16 11:55:19 EDT" 

El resultado de POSIXlt es realmente correcto.

Además, ¿hay alguna manera de hacer esta conversión sin especificar el origen?

Gracias

Respuesta

20

La página de ayuda en realidad apunta a una diferencia:

Value: 

    ‘as.POSIXct’ and ‘as.POSIXlt’ return an object of the appropriate 
    class. If ‘tz’ was specified, ‘as.POSIXlt’ will give an 
    appropriate ‘"tzone"’ attribute. 

este material es meticuloso - creo que hay una conversión implícita TZ pasando por as.POSIXct. Consideran que

R> print(as.numeric(as.POSIXct(as.POSIXlt(1268736919, 
           origin="1970-01-01"))), digits=10) 
[1] 1268736919 
R> print(as.numeric(as.POSIXct(1268736919, origin="1970-01-01")), digits=10) 
[1] 1268758519 

el segundo (utilizando as.POSIXct) no devuelve la entrada original. Desafortunadamente, Brian D. Ripley parece ser el único humano que tiene todos los detalles aquí.

Por último, no puede hacerlo sin el origen. Pero podría definir envolturas que usan la época como origen (como aquí) o usar 2000-01-01 o ... Simplemente mantenerlo consistente.

+0

Dirk - Gracias por su explicación. Entonces, ¿qué sugieres que haga aquí? Tengo un conjunto de datos de series de tiempo completo con marcas de tiempo de Unix. Esperaba usar xts para representarlos. – signalseeker

+0

Bueno, esto también lo hago todo el tiempo (cuando se interconectan datos de almacenes de datos internos) y acepto que 'as.POSIXct (vecOfTimestamps)' obtendrá valores de tiempo local. Si observamos lo que encontramos aquí, pasar por 'as.POSIXlt' como un paso adicional primero puede ser útil. Todavía tengo la escritura de una representación correcta de C++ como un elemento TODO para Rcpp también. –

+0

Gracias por ahora tomaré su sugerencia para dar el paso adicional. Algo para analizar más a fondo cuando tengo oportunidad. ¿Hay un rastreador de errores R donde puedo publicar esto? – signalseeker

Cuestiones relacionadas