Schnellste Weg zum extrahieren von Datum von Datum und Zeit in der R
Ich habe eine Spalte mit Daten, die als Zeichen im format 10/17/2017 12:00:00 AM
. Ich will nur den date-Teil, d.h. 2017-10-17
. Ich bin mit -
df$ReportDate = as.Date(df$ReportDate, format = "%m/%d/%Y %I:%M:%S %p")
df$ReportDate = as.Date(format(df$ReportDate, "%Y-%m-%d"))
dies funktioniert, aber der dataframe hat über 5 Millionen Zeilen, so dass diese dauert knapp zwei Minuten.
user system elapsed
104.73 0.55 105.46
Ist es ein schneller und effizienter Weg, dies zu tun?
- Eine excel-Datei hat über 5M Zeilen? Ich vermute, dass Ihr eine csv-Datei. versuchen Sie es mit
fread
ausdatatable
Paket - Sorry, ich glaube, meine Frage war unklar. Es ist nicht die Lektüre Prozess, der Zeit braucht, sondern nur die Datums-Konvertierung. Wird Bearbeiten.
- Ist diese für Berechnungen oder für die Berichterstattung. Ihre zwei Zeilen code return entspricht Vektoren, zumindest für mich.
df <- rep("8/31/2017 12:30:00 pm", 5e6); df <- as.Date(df, format = "%m/%d/%Y %I:%M:%S %p"); df1 <- as.Date(format(df, "%Y-%m-%d")); all(df == df1)
- Könnten Sie
substr
zu extrahieren, die nur den date-Teil - lassen Sie die Zeit hinter sich - und dann verwenden Sieas.Date(df$ReportDate, format = "%m/%d/%Y)
könnte schneller sein, ohne Analyse der Zeit als gut - ich bin mir nicht sicher. Ich bin mir auch nicht sicher, warum Sie mitas.Date
zweimal. Nicht einmal genug? - Sorry, warum gehst du nicht versuchen, mit
strptime
- Ich würde auch vorschlagen, ein dupe: gibt es eine schnelle parser für Datum?. Die Antwort deutet auf eine etwa 2x speedup mit der
fasttime
Paket. as.Date("10/17/2017 12:00:00 AM", format = "%m/%d/%Y")
ist genug. "Jeder Eingabe-string verarbeitet wird, soweit erforderlich, für die festgelegten format ein: alle nachfolgenden Zeichen werden ignoriert."- Ich benutze als.Datum doppelt, weil die Daten ursprünglich gespeichert in character-Typ (der dataframe wird importiert mit fread). Also die erste Konvertierung konvertiert zum date-Objekt. Ich extrahieren Sie dann das Datum mit
format
wandelt den Typ zurück zum Charakter. Da ich es als date-Objekt für die weitere Arbeit, ich als.Datum ein zweites mal zu konvertieren in date-Objekt. - Das funktioniert! Und es dauert 4 Sekunden, also etwa 25x schneller. Wenn Sie einen Beitrag als Antwort werde ich akzeptieren.
- Die zweite Konvertierung ist überflüssig. Wie Sie sagen, die erste Konvertierung-konvertiert in ein Date-Objekt. Das exakt gleiche Datum-Objekt, das die zweite Zeile konvertiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie, dass
as.Date
ignoriert die junk-nach dem Tag also, dieser dauert weniger als 10 Sekunden auf meinem nicht besonders schnell laptop:Könnte es effizienter sein, zu konvertieren von
Date
zucharacter
:Date
für weitere Operationen damit der endgültigen Umstellung mitas.Date()
character
und nichtDate
, so macht es Sinn, @Henriks Lösung.