Ich verwende pandas.to_datetime
, um die Daten in meinen Daten zu analysieren. Pandas stellen standardmäßig die Daten mit dar datetime64[ns]
, obwohl die Daten alle nur täglich sind. Ich frage mich, ob es eine elegante / clevere Möglichkeit gibt, die Daten in datetime.date
oder datetime64[D]
so zu konvertieren , dass beim Schreiben der Daten in CSV die Daten nicht angehängt werden 00:00:00
. Ich weiß, dass ich den Typ manuell Element für Element konvertieren kann:
[dt.to_datetime().date() for dt in df.dates]
Aber das ist wirklich langsam, da ich viele Zeilen habe und es den Zweck der Verwendung irgendwie zunichte macht pandas.to_datetime
. Gibt es eine Möglichkeit, dtype
die gesamte Spalte auf einmal zu konvertieren ? Oder unterstützt alternativ pandas.to_datetime
eine Präzisionsspezifikation, damit ich den Zeitteil während der Arbeit mit täglichen Daten loswerden kann?
df.dates.apply(lambda x: x.date())
sollte aber zumindest etwas schneller sein. Werfen SieAntworten:
Seit der Version
0.15.0
kann dies jetzt einfach durchgeführt werden, indem.dt
nur auf die Datumskomponente zugegriffen wird:Das obige gibt einen
datetime.date
dtype zurück. Wenn Sie einen haben möchten,datetime64
können Sie nurnormalize
die Zeitkomponente auf Mitternacht setzen, sodass alle Werte auf Folgendes gesetzt werden00:00:00
:Dadurch bleibt der Typ d erhalten
datetime64
, auf dem Display wird jedoch nur derdate
Wert angezeigt .quelle
Einfache Lösung:
quelle
Während ich EdChums Antwort, die die direkteste Antwort auf die vom OP gestellte Frage ist, positiv bewertet habe, löst sie das Leistungsproblem nicht wirklich (sie basiert immer noch auf Python
datetime
basiert Objekten, und daher wird jede Operation an ihnen nicht vektorisiert - das heißt, es wird langsam sein).Eine leistungsstärkere Alternative ist die Verwendung
df['dates'].dt.floor('d')
. Genau genommen wird nicht nur der Datumsteil beibehalten, sondern nur die Zeit auf00:00:00
. Aber es funktioniert wie vom OP gewünscht, wenn zum Beispiel:groupby
... und es ist viel effizienter, da die Operation vektorisiert ist.
EDIT: in der Tat, die Antwort der OPs bevorzugt hätte wahrscheinlich „neuere Versionen von
pandas
nicht nicht die Zeit zu csv schreiben , wenn es00:00:00
für alle Beobachtungen“.quelle
to_json
schreibt noch das volle00:00:00
.date_format='iso'
?! Standardmäßig werden nur Sekunden seit der Epoche ausgegeben.dt.normalize()
bei Serien, die länger als einige hundert Elemente sind.Pandas
DatetimeIndex
undSeries
haben eine Methode namensnormalize
, die genau das tut, was Sie wollen.Sie können mehr darüber in dieser Antwort lesen .
Es kann als verwendet werden
ser.dt.normalize()
quelle
Pandas V0.13 +: Verwenden Sie
to_csv
mitdate_format
ParameterVermeiden Sie nach Möglichkeit, Ihre
datetime64[ns]
Serie in eineobject
dtype-Objektreihe zu konvertierendatetime.date
. Letzteres wird häufig unter Verwendungpd.Series.dt.date
von Zeigern gespeichert und ist im Vergleich zu einer reinen NumPy-basierten Reihe ineffizient.Da Ihr Anliegen beim Schreiben in CSV das Format ist , verwenden Sie einfach den
date_format
Parameter vonto_csv
. Beispielsweise:Formatierungskonventionen finden Sie in den Python-
strftime
Anweisungen .quelle
Dies ist eine einfache Möglichkeit, das Datum zu extrahieren:
quelle
Konvertieren in
datetime64[D]
:Wenn Sie dies einer DataFrame-Spalte neu zuweisen, wird es wieder auf [ns] zurückgesetzt.
Wenn Sie tatsächlich wollten
datetime.date
:quelle
dt
einschließen, überschreibt dieses Antwort-Snipet dieses Modul! @ Dale-Jung, könnte vielleicht die Zeile zu etwas wie dt_index änderndf.loc[date]
der Index beim nächsten Versuch, eine neue Zeile über die Methode hinzuzufügen , auf einen Zeitstempel zurückgesetzt wird, was bedeutet, dass nachfolgende Vergleiche nicht mehr funktionierenGeben Sie einfach eine aktuellere Antwort, falls jemand diesen alten Beitrag sieht.
Durch Hinzufügen von "utc = False" bei der Konvertierung in datetime wird die Zeitzonenkomponente entfernt und nur das Datum in einem datetime64 [ns] -Datentyp beibehalten.
Sie können es in Excel speichern, ohne den Fehler "ValueError: Excel unterstützt keine Datumsangaben mit Zeitzonen. Stellen Sie sicher, dass die Datumsangaben keine Zeitzone enthalten, bevor Sie in Excel schreiben."
quelle
Ich wollte in der Lage sein, den Typ für eine Reihe von Spalten in einem Datenrahmen zu ändern und dann die Uhrzeit zu entfernen, die den Tag hält. rund (), boden (), decken () alle arbeiten
quelle