Tengo un conjunto de datos con una variable entera que denota observaciones tomadas en intervalos de 5 minutos a lo largo de un día completo, pero cuando cuenta a 55, incrementa la hora. así que seguir "55" es "100", luego "105"... y después de "955" es "1000". Esencialmente es un reloj hh:mm de 24 horas, pero omite los ceros anteriores. Necesito convertir estos en objetos de tiempo, pero no he encontrado una función simple dentro del paquete lubridate.

Mi último recurso sería convertir esta variable en una cadena, usar bucles "if" para pegar en 3, 2 o 1 cero a cada uno para poder llamar a parse_date_time(data$interval, "H! M!") pero me pregunto si hay una solución más elegante que no soy consciente de?

r
0
lschoen 4 nov. 2019 a las 08:47

1 respuesta

Use sprintf para convertir el número entero en una cadena de ancho fijo y luego conviértalo en un objeto de tiempo.

x <- c(50, 55, 100, 105, 955, 1000)
as.POSIXct(sprintf("%04d", x), format = "%H%M", tz = "UTC")

#[1] "2019-11-04 00:50:00 UTC" "2019-11-04 00:55:00 UTC" "2019-11-04 01:00:00 UTC"
#[4] "2019-11-04 01:05:00 UTC" "2019-11-04 09:55:00 UTC" "2019-11-04 10:00:00 UTC"

También se pueden lograr resultados similares con stringr::str_pad y strptime

strptime(stringr::str_pad(x, 4, pad = 0), format = "%H%M", tz = "UTC")

O usando parse_date_time

lubridate::parse_date_time(sprintf("%04d", x), "HM")
0
Ronak Shah 4 nov. 2019 a las 05:52