2012-08-28 18 views
6

Estoy haciendo un experimento que produce datos automáticamente registrados. El software produce una marca de tiempo que tiene el formato 41149.014850. Me gustaría convertir esta marca de tiempo decimal a 28.08.2012 00:21:23. ¿Cómo puedo hacer esto en R de la manera más elegante?Cómo convertir elegantemente la fecha y hora de decimal a "% d.% M.% Y% H:% M:% S"?

He intentado utilizar la función strsplit y también la función as.Date con un origen específico, y también la función times. Pero fue en vano. Tengo problemas para dividir la marca de tiempo en dos números a los que puedo acceder con las funciones as.Date y times.

Aquí hay un código de demostración:

myDatetime <- c(41149.004641, # 28.08.2012 00:06:41 
41149.009745, # 28.08.2012 00:14:02 
41149.014850, # 28.08.2012 00:21:23 
41149.019954) # 28.08.2012 00:28:44 

## not working out for me 
Dat.char <- as.character(myDatetime) 
date.split <- strsplit(Dat.char, split = "\\.") 
## how to proceed from here, if it is a good way at all 

Por favor, hágamelo saber si usted necesita más información acerca de la oposición o de que pueda plantear la cuestión de una mejor manera. Cualquier búsqueda fue en vano.

La ayuda directa o el enlace a otros sitios web/publicaciones es muy apreciada.

Respuesta

9

Sus fechas están en formato de fecha similar a Excel (días después del 1 de enero de 1900), por lo que debe convertirlas a un formato de fecha R. Luego puede convertirlo a formato de fecha y hora (POSIXct).

# first convert to R Date 
datetime <- as.Date(myDatetime-1, origin="1899-12-31") 
# now convert to POSIXct 
(posixct <- .POSIXct(unclass(datetime)*86400, tz="GMT")) 
# [1] "2012-08-28 00:06:40 GMT" "2012-08-28 00:14:01 GMT" 
# [3] "2012-08-28 00:21:23 GMT" "2012-08-28 00:28:44 GMT" 
# times are sometimes off by 1 second, add more digits to seconds to see why 
options(digits.secs=6) 
posixct 
# [1] "2012-08-28 00:06:40.9823 GMT" "2012-08-28 00:14:01.9680 GMT" 
# [3] "2012-08-28 00:21:23.0399 GMT" "2012-08-28 00:28:44.0256 GMT" 
# round to nearest second 
(posixct <- round(posixct, "sec")) 
# [1] "2012-08-28 00:06:41 GMT" "2012-08-28 00:14:02 GMT" 
# [3] "2012-08-28 00:21:23 GMT" "2012-08-28 00:28:44 GMT" 
# now you can convert to your desired format 
format(posixct, "%d.%m.%Y %H:%M:%S") 
# [1] "28.08.2012 00:06:41" "28.08.2012 00:14:02" 
# [3] "28.08.2012 00:21:23" "28.08.2012 00:28:44" 
2

Esto se acerca: Los números indican el número de segundos transcurridos desde una fecha cercana a 1/1/1900:

as.POSIXct(x*3600*24, origin=as.Date("1900-01-01")-2, tz="UTC") 
[1] "2012-08-28 01:06:40 BST" "2012-08-28 01:14:01 BST" "2012-08-28 01:21:23 BST" 
[4] "2012-08-28 01:28:44 BST" 

todavía hay un desplazamiento de zona horaria no.

Cuestiones relacionadas