390 Stimmen

Nur das Datumsteil beibehalten, wenn pandas.to_datetime verwendet wird

Ich benutze pandas.to_datetime, um die Daten in meinem Datensatz zu parsen. Pandas stellt die Daten standardmäßig als datetime64[ns] dar, obwohl die Daten alle täglich sind. Ich frage mich, ob es einen eleganten/cleveren Weg gibt, die Daten in datetime.date oder datetime64[D] umzuwandeln, so dass, wenn ich die Daten in ein CSV schreibe, die Daten nicht mit 00:00:00 angehängt werden. Ich weiß, dass ich den Typ manuell elementweise konvertieren kann:

[dt.to_datetime().date() for dt in df.dates]

Aber das ist wirklich langsam, da ich viele Zeilen habe, und es ist irgendwie kontraproduktiv, pandas.to_datetime zu verwenden. Gibt es eine Möglichkeit, den dtype der gesamten Spalte auf einmal umzuwandeln? Oder unterstützt pandas.to_datetime alternativ eine Präzisionsspezifikation, sodass ich den Zeitteil loswerden kann, während ich mit täglichen Daten arbeite?

589voto

EdChum Punkte 333941

Seit Version 0.15.0 kann dies nun einfach mit .dt durchgeführt werden, um nur auf das Datum zuzugreifen:

df['nur_datum'] = df['dates'].dt.date

Das oben genannte liefert datetime.date, also den dtype object. Wenn Sie den dtype als datetime64 beibehalten möchten, können Sie einfach normalize:

df['normalisiertes_datum'] = df['dates'].dt.normalize()

Damit wird die Zeitkomponente auf Mitternacht, d.h. 00:00:00 gesetzt, aber die Anzeige zeigt nur den Datumswert.

90voto

Gil Baggio Punkte 10839

Einfache Lösung:

df['date_only'] = df['date_time_column'].dt.date

38voto

Pietro Battiston Punkte 7097

Während ich EdChums Antwort hochgevoted habe, die die direkteste Antwort auf die Frage des OP ist, löst sie das Leistungsproblem nicht wirklich (sie verlässt sich immer noch auf Python datetime-Objekte, und daher wird jede Operation auf ihnen nicht vektorisiert sein - das heißt, sie wird langsam sein).

Eine bessere alternative Lösung ist:

df['dates'].dt.floor('d')

Genau genommen "behält es nur den Datumsteil nicht", da es einfach die Zeit auf 00:00:00 setzt. Aber es funktioniert wie gewünscht vom OP, wenn zum Beispiel:

  • ausgegeben wird
  • in eine CSV-Datei gespeichert wird
  • die Spalte für das groupby verwendet wird

... und es ist viel effizienter, da die Operation vektorisiert ist.

EDIT: tatsächlich wäre die Antwort, die der OP wahrscheinlich bevorzugt hätte, wahrscheinlich "neuere Versionen von pandas schreiben die Zeit nicht in die CSV, wenn es 00:00:00 für alle Beobachtungen ist".

23voto

jpp Punkte 146159

Pandas v0.13+: Verwenden Sie to_csv mit dem Parameter date_format

Vermeiden Sie, wo möglich, die Konvertierung Ihrer datetime64[ns]-Serie in eine Serie mit dem Datentyp object von datetime.date-Objekten. Letztere, oft erstellt mit pd.Series.dt.date, wird als Array von Zeigern gespeichert und ist im Vergleich zu einer rein auf NumPy basierenden Serie ineffizient.

Da es Ihnen um das Format beim Schreiben in CSV geht, verwenden Sie einfach den Parameter date_format von to_csv. Zum Beispiel:

df.to_csv(filename, date_format='%Y-%m-%d')

Siehe Python's strftime Direktiven für Formatkonventionen.

22voto

Mani Abi Anand Punkte 1225

Dies ist eine einfache Möglichkeit, das Datum zu extrahieren:

import pandas as pd

d = '2015-01-08 22:44:09' 
date = pd.to_datetime(d).date()
print(date)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X