2016-10-24 3 views
1

ich mit unordentlichen arbeite Excel-Datei mit mehreren DatumsformateUmwandlung mehrere Datumsformate in einer in r

2016-10-17T12:38:41Z 
Mon Oct 17 08:03:08 GMT 2016 
10-Sep-15 
13-Oct-09 
18-Oct-2016 05:42:26 UTC 

ich alle oben in yyyy-mm-dd Format konvertieren möchten. Ich verwende folgenden Code für die Konvertierung, aber viele Werte kommen NA.

as.Date(parse_date_time(df$date,c('mdy', 'ymd_hms','a b d HMS y','d b y HMS'))) 

Wie kann ich es alle zusammen tun. Ich habe andere Threads zu ähnlichen Fällen gelesen, aber nichts scheint für meinen Fall zu funktionieren. Bitte helfen

+0

'parse_date_time (df $ datum, c ('dmy', 'YmdT', 'abd T Y', 'dmYT'))' – alistaire

Antwort

4

Wenn ich 'dmy' zur Liste hinzufügen, dann zumindest alle Fälle in Ihrem Beispiel erfolgreich analysiert werden:

z <- c("2016-10-17T12:38:41Z", "Mon Oct 17 08:03:08 GMT 2016", 
"10-Sep-15", "13-Oct-09", "18-Oct-2016 05:42:26 UTC") 

library(lubridate) 
parse_date_time(z,c('mdy', 'dmy', 'ymd_HMS','a b d HMS y','d b y HMS')) 
## [1] "2016-10-17 12:38:41 UTC" "2016-10-17 08:03:08 UTC" 
## [3] "2015-09-10 00:00:00 UTC" "2009-10-13 00:00:00 UTC" 
## [5] "2016-10-18 05:42:26 UTC" 

Ihr großes Problem wird das dritte und vierte Element sein: Diese sind eigentlich gemeint zu 'ymd' bzw. 'dmy' sein? Ich bin mir nicht sicher, wie eine Logik Sie diese Unterschiede automatisch erkennen lassen kann ... aus dem Zusammenhang, "15 September 2010" und "10 September 2015" scheinen beide vollkommen vernünftige Möglichkeiten ...

Für was es wert ist Ich habe auch versucht, die neue anytime package - es behandelt nur das erste und letzte Element.

3

Durch das vorherige Entfernen der Zeiten können nur drei Alternativen in orders angegeben werden, um die Beispieldaten in der Frage zu analysieren. Dies deutet 10-Sep-15 und 13-Oct-09 als dmy aber wenn man sie als ymd interpretiert wollen, dann Kommentar- der kommentierten out line:

orders <- c("dmy", "mdy", "ymd") 
# orders <- c("ymd", "dmy", "mdy") 

as.Date(parse_date_time(gsub("..:..:..", " ", x), orders = orders)) 

geben:

[1] "2016-10-17" "2016-10-17" "2015-09-10" "2009-10-13" "2016-10-18" 

oder wenn der Kommentar gesetzt Linie ist unkommentiert dann:

[1] "2016-10-17" "2016-10-17" "2010-09-15" "2013-10-09" "2016-10-18" 

Hinweis: Der Eingang ist:

x <- c("2016-10-17T12:38:41Z ", "Mon Oct 17 08:03:08 GMT 2016", "10-Sep-15", 
"13-Oct-09", "18-Oct-2016 05:42:26 UTC") 
Verwandte Themen