J'ai un ensemble de données avec une variable entière qui dénote des observations prises à des intervalles de 5 minutes tout au long d'une journée complète, mais quand il compte jusqu'à 55, il incrémente l'heure. donc après "55" est "100", puis "105" ... et après "955" est "1000". Il s'agit essentiellement d'une horloge de 24 heures hh: mm, mais omet les zéros précédents. J'ai besoin de les convertir en objets temporels, mais je n'ai pas trouvé de fonction simple dans le package lubridate.

Mon dernier recours serait de convertir cette variable en chaîne, d'utiliser des boucles "if" pour coller sur 3, 2 ou 1 zéro dans chacune afin que je puisse appeler parse_date_time (data $ interval, "H! M!") Mais je Je me demande s'il y a une solution plus élégante que je ne connais pas?

r
0
lschoen 4 nov. 2019 à 08:47

1 réponse

Utilisez sprintf pour convertir l'entier en chaîne de largeur fixe, puis convertissez-le en objet temporel.

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"

Des résultats similaires peuvent également être obtenus avec stringr::str_pad et strptime

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

Ou en utilisant parse_date_time

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