2016-12-03 2 views
1

Ich kann Dateien empfangen, deren Datum in einem der zwei Formate sein kann: "MM/TT/JJJJ" oder " JJJJ-MM-TT ". Sie sind Faktoren für den Anfang. Ungeachtet des Datumsformats, in dem ich es erhalte, möchte ich in der Lage sein, sie in den Datentyp "Datum" des Formats "JJJJ-MM-TT" zu konvertieren. Ich habe versucht,So konvertieren Sie das Datum in das Format "JJJJ-MM-TT" in R, wenn der Eingabewert verschiedene Formate annehmen kann

df_1$Date <- as.Date(as.character(df_1$Date), format = "%Y-%m-%d")

Verwendung Das funktioniert mit dem Format "yyyy-mm-dd", sondern gebe NA, wenn die Eingangswerte von Format "mm/tt /". In ähnlicher Weise funktionieren andere Methoden, die ich ausprobiert habe, nur für eines dieser beiden Formate. Ich brauche es für beide zu arbeiten.

Unten habe ich Code zum Erstellen der Datasets und Replizieren des Problems veröffentlicht.

df_1 <- structure(list(Text.Identifier = c(4L, 5L, 7L, 1838L), Date = structure(c(2L, 
                     2L, 1L, 3L), .Label = c("5/18/2016", "7/12/2015", "8/29/2016" 
                    ), class = "factor")), .Names = c("Text.Identifier", "Date"), class = "data.frame", row.names = c(NA, 
                                             -4L)) 

df_2 <- structure(list(Text.Identifier = 1:4, Date = structure(c(5L, 
                5L, 5L, 1L), .Label = c("2015-07-12", "2016-05-01", "2016-05-05", 
                      "2016-05-09", "2016-05-12", "2016-05-18", "2016-08-01", "2016-08-19", 
                      "2016-08-29", "2016-09-20"), class = "factor")), .Names = c("Text.Identifier", 
                                     "Date"), row.names = c(NA, 4L), class = "data.frame") 

df_1$Date <- as.Date(df_1$Date, format = "%Y-%m-%d") 
df_2$Date <- as.Date(df_2$Date, format = "%Y-%m-%d") 
View(df_1) 
View(df_2) 
+2

Überprüfen Sie die 'parse_date_time' im' lubridate' Paket. Es lohnt sich auch, das Denken von Excel zu reorientieren, wo die exakte Reihenfolge in eine R-Form des Denkens kam, wo es wichtiger ist, mit welcher Klasse Sie es zu tun haben. – boshek

+0

Potentielles Duplikat von vor 7 Stunden http://stackoverflow.com/a/40940164/5472462, das diese Frage sehr gut beantwortet. – vincentmajor

+0

Mögliches Duplikat von [Funktion, um das korrekte as.Date-Format in R automatisch anzuwenden] (http://stackoverflow.com/questions/40940016/function-to-automatisch-apply-correct-as-date-format-in-r) – vincentmajor

Antwort

1

Wenn Sie nur zwei Datumsformate sind sicher sind "mm/tt /" oder "yyyy-mm-dd", sollte diese Arbeit. Diese Lösung verwendet grep, um einen Schrägstrich in den Datumsangaben zu finden, und konvertiert diese Datumsangaben von "MM/TT/JJJJ" in "JJJJ-MM-TT". Hier

ein Beispiel:

dates <- data.frame(date = c("2015-11-01", "12/12/2016", "1992-05-28", "03/05/2011"), stringsAsFactors = FALSE) 

dates$date[grep("/", dates$date)] <- as.character(as.Date(dates$date[grep("/", dates$date)], "%m/%d/%Y")) 
+0

Sie verwenden 'stringsAsFactors = FALSE', aber das OP gab an, dass die Daten als Faktoren gespeichert werden. – RHertel

1

Ich schlage vor, mit der anydate() Funktion aus der anytime Bibliothek. Es eignet sich besser für diesen Fall als lubridateparse_date_time(), da es die Daten erkennt, ohne dass eine Benutzereingabe bezüglich der Reihenfolge der Einträge erforderlich ist, wie ymd oder dmy. Darüber hinaus gibt es kein Problem, wenn die Daten als Faktoren gespeichert werden.

Hier ist ein Beispiel:

my_dates <- c("2015-07-12", "2016-05-01", "2016-05-05", "2016-05-09", 
"2016-05-12", "2016-05-18", "2016-08-01", "2016-08-19", "2016-08-29", 
"2016-09-20", "5/18/2016", "7/12/2015", "8/29/2016") 
my_dates <- as.factor(my_dates) 
library(anytime) 
anydate(my_dates) 
# [1] "2015-07-12" "2016-05-01" "2016-05-05" "2016-05-09" "2016-05-12" "2016-05-18" 
# [7] "2016-08-01" "2016-08-19" "2016-08-29" "2016-09-20" "2016-05-18" "2015-07-12" 
#[13] "2016-08-29 

Man kann überprüfen, ob die Klasse der Ausgabe in der Tat ist Date

class(anydate(my_dates)) 
#[1] "Date" 

während eine andere Lösung gepostet ein POSIX-Objekt mit unnötigen Zeitzoneninformationen liefert.

1

Hinzufügen meines Kommentars als Antwort, so können wir diese Frage markiert beantworten.

Das Paket lubridate ist intelligent genug, um zwischen verschiedenen Datumstrennzeichen und auch verschiedenen Datumsreihenfolgen zu wählen.

library(lubridate) 
data = c("01-12-2000", "02-11-2001", "2016-06-20", "2016-12-05") 
parse_date_time(data, c('dmy', 'ymd')) 

## returns 
## [1] "2000-12-01 UTC" "2001-11-02 UTC" "2016-06-20 UTC" "2016-12-05 UTC" 
Verwandte Themen