2016-12-02 7 views
0

Ich versuche eine Funktion zu erstellen, die automatisch das Datumsformat einer Spalte in einem Datenrahmen bestimmt und die korrekte asDate() - Funktion anwendet. In der Regel kommen die Daten in "% Y-% m-% d" oder "% m /% d /% y" (dies ändert sich je nachdem, ob die .csv in Excel geöffnet und gespeichert wurde).Funktion zum automatischen Anwenden des korrekten as.Date-Formats in R

Anfangs dachte ich, ein „if/else“ Anweisung funktionieren würde, und kam mit dem Follow-up:

if(nchar(df$date[[1]] == 10)){ 
    df$Date <- as.Date(df$Date) 
} else { 
    df$Date <- as.Date(df$Date, format = "%m/%d/%y" 

Aber es wirft eine „Zeichenkette in einem Standard-Format eindeutig nicht“ Fehler.

Hier ist ein Beispieldatenrahmen mit arbeiten:

a <- seq(1:10) 
dates1 <- c("3/21/16", "3/22/16", "3/23/16", "3/24/16", "3/25/16", "3/26/16", "3/27/16", "3/28/16", "3/29/16", "3/30/16") 
dates2 <- c("2016-03-21", "2016-03-22", "2016-03-23", "2016-03-24", "2016-03-25", "2016-03-26", "2016-03-27", "2016-03-28", "2016-03-29", "2016-03-30") 

df <- data.frame(a, dates1, dates2) 

df$dates1 <- as.character(df$dates1) 
df$dates2 <- as.character(df$dates2) 

Die if/else-Anweisung sollte in der Lage sein, die Arbeit an „dates1“ und „dates2“, aber wie Sie sehen können, es funktioniert nur mit " dates2 "

if(nchar(df$dates1[[1]] == 10)){ 
     df$dates1 <- as.Date(df$dates1) 
} else { 
     df$dates1 <- as.Date(df$dates1, format = "%m/%d/%y") 
} 

if(nchar(df$dates2[[1]] == 10)){ 
     df$dates2 <- as.Date(df$dates2) 
} else { 
     df$dates2 <- as.Date(df$dates2, format = "%m/%d/%y") 
} 

Entschuldigung im Voraus für alle Formatierungsprobleme.

+1

Sie müssen 'dput()' die Daten für uns in der Lage sein, dies zu lösen –

+0

Dies sollte Ihre Bedenken beantworten. Es ist genau dasselbe, als was du falsch machst. Lösungen zur Überwindung dieses Problems bieten auch @dirk .............................. http: //stackoverflow.com/questions/14755425/Was-sind-die-Standard-Eindeutige-Datumsformate – user5249203

+0

Ich denke ich kann raten, aber ich möchte, dass du ein reproduzierbares Beispiel gibst. Ihr grundsätzliches Problem ist, dass 'as.Date' standardmäßig vektorisiert wird; Sie müssen entweder nacheinander die Elemente von 'df $ Date 'durchgehen oder identifizieren, welche in welchem ​​Format sind und diese separat konvertieren ... –

Antwort

1

Sie können dazu das Paket lubridate verwenden. Zum Beispiel:

date_object = mdy_hms('12-31-16 13:42:15') 
date_object = mdy_hms('12/31/16 13-42-15') 

alle funktionieren gut. lubridate versucht zu erraten, wie das Datum auf Ihrer groben Schätzung basiert.

Sie können sogar eine Liste der Formate zur Verfügung stellen, und es wird die geeignete wählen:

parse_date_time(c('12-31-16', '31-12-16'), c('mdy', 'dmy')) 

Dies ist besonders praktisch, wenn das Datumsformat auf halber Höhe eines langen Datensatzes ändert.

+0

Das hat super funktioniert, danke! – Michael

Verwandte Themen