2017-09-07 1 views
1

J'ai un grand ensemble de données (quelques millions d'observations) qui contient une variable datetime avec un format incohérent: "% Y-% m-% d% H:% M:% S"; "% m /% d /% Y et% H:% M:% S".Mise en forme d'une variable datetime incohérente

Voici comment l'ensemble de données ressemble à:

df <- data.frame(var1 = c(1:6), 
    var2 = c("A", "B", "C", "A", "B", "C"), 
    datetime = c("2013-07-01 00:00:02", "2016-07-01 00:00:01", 
      "9/2/2014 00:01:20", "9/1/2014 00:00:25", 
      "1/1/2015 0:07", "6/1/2015 0:01")) 

Y at-il un moyen efficace de formater la variable datetime dans un format de temps la date cohérente unique?

+1

Si vous n'aviez pas de dates ambiguës (telles que 9/2/2014), vous pouvez utiliser 'anytime' du paquetage anytime. En l'état, vous ne pouvez utiliser 'as.POSIXct' avec tous les formats que vous avez dans vos données et fusionner les résultats dans un seul vecteur – Roland

Répondre

2

POSIXCT solution en utilisant parse_date_time.

EDIT: incorporant le format POSIXCT de @Akarsh Jain pour un meilleur alignement temporel.

df$new_date <- parse_date_time(df$datetime, c("%Y-%m-%d %H:%M:%S", "%m/%d/%Y %H:%M:%S", "%m/%d/%Y %H:%M")) 
+0

Ouais ... J'étais sur le point de publier ce' df $ datetime <- parse_date_time (df $ datetime , c ("% Y-% m-% d% H:% M:% S", "% m /% d /% Y% H:% M:% S", "% m /% d /% Y % H:% M "))' – Sagar

+0

Je viens de poster le même @ D.sen. Par coïncidence. J'espère que ça ne vous dérangera pas. –

+0

^C'est une meilleure réponse car je me rends compte que ma solution est en train d'adapter les 7 minutes à 7 secondes. –

2

Vous pouvez utiliser un ensemble lubrifiant comme celui-ci.

lubridate::parse_date_time(x = df$datetime, c("ymd HMS","mdy HMS")) 

[1] "2013-07-01 00:00:02 UTC" "2016-07-01 00:00:01 UTC" "2014-09-02 00:01:20 UTC" 
[4] "2014-09-01 00:00:25 UTC" NA      NA      
Warning message: 
2 failed to parse. 

lubridate::parse_date_time(x = df$datetime, c("ymd HMS","mdy HMS","mdy HM")) 

[1] "2013-07-01 00:00:02 UTC" "2016-07-01 00:00:01 UTC" "2014-09-02 00:01:20 UTC" 
[4] "2014-09-01 00:00:25 UTC" "2015-01-01 00:07:00 UTC" "2015-06-01 00:01:00 UTC" 

Vous pouvez spécifier vos formats de date-heure au besoin, vous pouvez comparer deux exemples que je parlais.

Espérons que cela vous aide. :)