So ändern Sie das Datetime-Format in Pandas

Lesezeit: 9 Minuten

Benutzeravatar von yome
Yo Ich

Mein Datenrahmen hat eine DOB Spalte (Beispielformat 1/1/2016), die standardmäßig in Pandas dtype ‘object’ konvertiert wird.

Konvertieren Sie dies in das Datumsformat mit df['DOB'] = pd.to_datetime(df['DOB'])das Datum wird umgewandelt in: 2016-01-26 und sein dtype ist: datetime64[ns].

Jetzt möchte ich dieses Datumsformat konvertieren 01/26/2016 oder jedes andere allgemeine Datumsformat. Wie mache ich es?

(Egal welche Methode ich versuche, es zeigt immer das Datum an 2016-01-26 Format.)

  • Suchen Sie eine Lösung, die nur unter Jupyter Notebook funktioniert? (in diesem Fall verwenden Sie einen spaltenweisen ‘Styler’) oder funktioniert in der einfachen Python-Konsole und in iPython?

    – smci

    20. April 2020 um 8:44 Uhr

  • Notiz: datetime als Datenstruktur, um Informationen über Datum und Uhrzeit zu halten hat kein Format – es ist nur eine Datenstruktur. Sein Inhalt könnte sein angezeigt in gewisser Weise / “Format”. Oder wenn Sie Zeichenfolgen haben, die Datum/Uhrzeit darstellen, kann es darin auf eine bestimmte Weise / “Format” ausgedrückt werden.

    – FObersteiner

    21. Oktober 2021 um 10:00 Uhr


  • @MrFuppes Das stimmt, aber es hat ein Standardformat mit dem __str__() Methode. Ich erwähne nur, falls Neulinge verwirrt sind.

    – wjandrea

    7. November 2021 um 21:24 Uhr


Benutzeravatar von jezrael
Israel

Sie können verwenden dt.strftime wenn Sie konvertieren müssen datetime in andere Formate (aber beachten Sie, dass dann dtype der Spalte wird object (string)):

import pandas as pd

df = pd.DataFrame({'DOB': {0: '26/1/2016', 1: '26/1/2016'}})
print (df)
         DOB
0  26/1/2016 
1  26/1/2016

df['DOB'] = pd.to_datetime(df.DOB)
print (df)
         DOB
0 2016-01-26
1 2016-01-26

df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print (df)
         DOB        DOB1
0 2016-01-26  01/26/2016
1 2016-01-26  01/26/2016

  • ‘strftime’ konvertiert die Datetime-Spalte in Unicode, um die Operation auf DOB1 anzuwenden. Wir müssen sie erneut in Datetime konvertieren. Gibt es keine andere Möglichkeit zu formatieren, ohne den data_type zu verlieren?

    – M.Zaman

    24. November 2017 um 12:02 Uhr

  • Lassen Sie uns diese Diskussion im Chat fortsetzen.

    – Israel

    21. Februar 2019 um 14:45 Uhr

Benutzeravatar von Yanni Cao
Janni Cao

Ändern des Formats, aber nicht des Typs:

df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))

  • Denken Sie daran, dass df[“date”] sollte datetime64 sein, bevor Sie dies tun

    – zusätzl

    18. Juli 2019 um 14:59 Uhr

  • Nein! Angenommen, der ursprüngliche Wert eines Artikels in der date Spalte ist „November 262019“. strftime() meint “Schnur aus der Zeit”Also df["date"].dt.strftime('%Y-%m') wird ein … sein Schnur "2019-11" für diesen Artikel. Dann, pd.to_datetime() konvertiert diesen String der Rücken zum datetime64 Format, aber jetzt als „November 1, 2019“! Das Ergebnis wird also sein: Keine Formatänderung, sondern die Änderung des Datumswertes selbst!

    – MarianD

    17. Februar 2020 um 23:38 Uhr


  • @MarianD: Alle Ihre Kommentare zu einzelnen Antworten sind nützlich, aber können Sie sie bitte in einem Rollup von “Fallstricke / Tun Sie diese nicht” am Ende Ihrer Antwort zusammenfassen? Außerdem müssen Sie klar angeben, was das Problem mit jedem dieser Elemente ist: Wenn eines der Eingabedaten nicht im erwarteten Format vorliegt, besteht entweder die Gefahr, dass Ausnahmen ausgelöst werden, oder das Datum wird verstümmelt. Einfach “Nein!” schreiben. überall vermittelt das nicht.

    – smci

    20. April 2020 um 8:29 Uhr


Benutzeravatar von MarianD
MarianD

Es gibt einen Unterschied zwischen

  • das Inhalt einer Datenrahmenzelle (ein Binärwert) und
  • es ist Präsentation (zeigt es) für uns Menschen.

Die Frage ist also: Wie erreicht man das Passende Präsentation meiner Daten, ohne die Daten / Datentypen selbst zu ändern?

Hier ist die Antwort:

  • Wenn Sie die verwenden Jupyter-Notizbuch zum Anzeigen Ihres Datenrahmens oder
  • wenn Sie eine Präsentation in Form einer erreichen möchten HTML-Datei (selbst bei vielen zubereiteten überflüssigen id und class Attribute für des Weiteren CSS-Stil – Sie können sie verwenden oder nicht),

verwenden Styling. Styling ändert keine Daten / Datentypen von Spalten Ihres Datenrahmens.

Jetzt zeige ich Ihnen, wie Sie es im Jupyter-Notebook erreichen – für eine Präsentation in Form einer HTML-Datei siehe den Hinweis am Ende dieser Antwort.

Ich nehme an, dass Ihre Kolumne DOB hat schon die datetime64 Typ (Sie haben gezeigt, dass Sie wissen, wie man es erreicht). Ich habe einen einfachen Datenrahmen (mit nur einer Spalte) vorbereitet, um Ihnen ein grundlegendes Styling zu zeigen:

  • Nicht gestylt:

    df
    
          DOB
0  2019-07-03
1  2019-08-03
2  2019-09-03
3  2019-10-03
  • Stylen Sie es als mm/dd/yyyy:

    df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
    
          DOB
0  07/03/2019
1  08/03/2019
2  09/03/2019
3  10/03/2019
  • Stylen Sie es als dd-mm-yyyy:

    df.style.format({"DOB": lambda t: t.strftime("%d-%m-%Y")}) 
    
          DOB
0  03-07-2019
1  03-08-2019
2  03-09-2019
3  03-10-2019

Vorsichtig sein!

Das zurückgegebene Objekt ist KEIN Datenrahmen – es ist ein Objekt der Klasse StylerAlso weisen Sie es nicht zurück zu df:

Tun Sie dies nicht:

df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})    # Don't do this!

(Jeder Datenrahmen hat sein Styler-Objekt, auf das zugegriffen werden kann .style Eigentum, und wir haben dies geändert df.style Objekt, nicht der Datenrahmen selbst.)


Fragen und Antworten:

  • Q: Warum Ihr Styler-Objekt (oder ein Ausdruck, der ihn zurückgibt) verwendet als der letzte Befehl in einer Jupyter-Notebook-Zelle zeigt Ihre (gestylte) Tabelle anund nicht das Styler-Objekt selbst?

  • EIN: Denn jedes Styler-Objekt hat eine Callback-Methode ._repr_html_() die einen HTML-Code zum Rendern Ihres Datenrahmens (als nette HTML-Tabelle) zurückgibt.

    Jupyter Notebook IDE ruft diese Methode auf automatisch um Objekte zu rendern, die es haben.


Notiz:

Sie benötigen das Jupyter-Notebook nicht zum Gestalten (d. h. zum netten Ausgeben eines Datenrahmens ohne seine Daten / Datentypen zu ändern).

Ein Styler-Objekt hat eine Methode render()wenn Sie einen String mit dem HTML-Code erhalten möchten (z. B. um Ihren formatierten Datenrahmen im Web zu veröffentlichen oder einfach Ihre Tabelle im HTML-Format darzustellen):

df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()

  • Es lohnt sich, darauf hinzuweisen Styler-Code wie dieser ist für die Ausführung vorgesehen und wird nur unter Jupyter-Notebooks wirksam und hat absolut keine Auswirkungen, wenn er in der Konsole oder in iPython ausgeführt wird. Das OP hat “unter Jupyter” nicht angegeben, daher kann dies je nach Einrichtung eine praktikable Lösung sein oder auch nicht. Viel Data-Science-Code wird kopiert und eingefügt, und die Jupyter-spezifischen Annahmen werden nicht explizit angegeben, dann fragen sich die Leute, warum der Styler-Code „nicht funktioniert“, wenn er in ihrer (Konsolen-)Umgebung ausgeführt wird.

    – smci

    20. April 2020 um 8:45 Uhr

  • @smci, wird nicht ausdrücklich im zweiten Absatz meiner Antwort erwähnt? In Form von Bedingung if, Aussage so bekannt für jeden Programmierer? — Trotzdem vielen Dank für Ihren Kommentar, er kann für einige Leute hilfreich sein.

    – MarianD

    20. April 2020 um 8:48 Uhr

  • nein das ist sehr unklar, auch begraben. Die ursprüngliche Frage hat nichts mit Jupyter zu tun, und das OP und einige Benutzer haben möglicherweise nicht einmal Jupyter zur Verfügung. Ihre Antwort müsste die erste Zeile fett gedruckt enthalten “Der folgende Ansatz (Stil) funktioniert nur unter Jupyter-Notebook und hat keinerlei Auswirkungen, wenn er außerhalb von Jupyter-Notebook ausgeführt wird.”. (In Data-Science-Blogs und -Websites sehe ich täglich Leute, die Jupyter-Code in Nicht-Jupyter-Umgebungen posten und sich fragen, warum es nicht funktioniert).

    – smci

    20. April 2020 um 8:52 Uhr


  • Kühl. Ich schlage auch vor, dass Sie alle (vielen) Fallstricke hinzufügen, die Sie bei den anderen “convert-to-string-with-strftime-then-back-again-with-pd.to_datetime”-Ansätzen identifiziert haben. Zumindest müssen Sie das Auslösen und Abfangen von Ausnahmen erwähnen. Ebenfalls, pd.to_datetime() hat die Argumente errors='raise'/'coerce'/'ignore', dayfirst, yearfirst, utc, exact um zu kontrollieren, wie präzise und ausnahmefreudig es ist und ob ungültige Ausgaben dazu gezwungen werden NaT oder was. Was es in „realen“ Datensätzen komplizierter macht, sind gemischte/fehlende/unvollständige Formate, Zeiten, Zeitzonen usw.; Ausnahmen sind nicht unbedingt schlecht.

    – smci

    20. April 2020 um 9:14 Uhr

  • Ok eines Tages. Solange Sie nicht “Nein!” darunter auch 🙂

    – smci

    20. April 2020 um 9:30 Uhr

Benutzeravatar von user3512680
Benutzer3512680

Im Vergleich zur ersten Antwort werde ich die Verwendung empfehlen dt.strftime() zuerst und dann pd.to_datetime(). Auf diese Weise ergibt sich immer noch der Datetime-Datentyp.

Zum Beispiel,

import pandas as pd

df = pd.DataFrame({'DOB': {0: '26/1/2016 ', 1: '26/1/2016 '})
print(df.dtypes)

df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print(df.dtypes)

df['DOB1'] = pd.to_datetime(df['DOB1'])
print(df.dtypes)

Benutzeravatar von rishi jain
Rishi jain

Der folgende Code hat bei mir anstelle des vorherigen funktioniert:

df['DOB']=pd.to_datetime(df['DOB'].astype(str), format="%m/%d/%Y")

  • Nein! Dein format='%m/%d/%Y' Parameter ist für Parsing eine Zeichenfolge, dh Sie sollen um die Zeichenfolge in einem solchen Format bereitzustellen (z.B "5/13/2019"). Nichts weiter, kein Formatwechsel. Es wird weiterhin als angezeigt 2019-05-13 — oder es wird eine Ausnahme ausgelöst, wenn df['DOB'].astype(str) enthält Artikel, die nicht in einem solchen Format vorliegen, z. B. in einem Format "2019-05-13".

    – MarianD

    18. Februar 2020 um 0:04 Uhr


  • Was ist “Der vorherige”? Auf welchen Beitrag bezieht es sich? Oder meinst du “die vorherigen” (alle von ihnen)? Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten (ändern), nicht hier in den Kommentaren (ohne “Bearbeiten:”, “Aktualisieren:” oder ähnliches – die Antwort sollte so aussehen, als wäre sie heute geschrieben).

    – Peter Mortensen

    24. Juli 2021 um 13:13 Uhr


Benutzeravatar von Peter Mortensen
Peter Mortensen

Sie können dies versuchen. Es konvertiert das Datumsformat in TT-MM-JJJJ:

df['DOB'] = pd.to_datetime(df['DOB'], dayfirst = True)

  • Nein! Dein format='%m/%d/%Y' Parameter ist für Parsing eine Zeichenfolge, dh Sie sollen um die Zeichenfolge in einem solchen Format bereitzustellen (z.B "5/13/2019"). Nichts weiter, kein Formatwechsel. Es wird weiterhin als angezeigt 2019-05-13 — oder es wird eine Ausnahme ausgelöst, wenn df['DOB'].astype(str) enthält Artikel, die nicht in einem solchen Format vorliegen, z. B. in einem Format "2019-05-13".

    – MarianD

    18. Februar 2020 um 0:04 Uhr


  • Was ist “Der vorherige”? Auf welchen Beitrag bezieht es sich? Oder meinst du “die vorherigen” (alle von ihnen)? Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten (ändern), nicht hier in den Kommentaren (ohne “Bearbeiten:”, “Aktualisieren:” oder ähnliches – die Antwort sollte so aussehen, als wäre sie heute geschrieben).

    – Peter Mortensen

    24. Juli 2021 um 13:13 Uhr


Benutzeravatar von Peter Mortensen
Peter Mortensen

Der folgende Code ändert sich in den Typ „datetime“ und formatiert auch in der angegebenen Formatzeichenfolge.

df['DOB'] = pd.to_datetime(df['DOB'].dt.strftime('%m/%d/%Y'))

  • ändere es so: df['DOB']=pd.to_datetime(df['DOB']).dt.strftime('%m/%d/%Y')

    – John Doe

    20. August 2019 um 8:59 Uhr

  • Nein!Warum Datumszeit in Zeichenfolge und dann zurück in Datumszeit konvertieren? Siehe meine Kommentare zu anderen Antworten.

    – MarianD

    18. Februar 2020 um 0:32 Uhr


1430380cookie-checkSo ändern Sie das Datetime-Format in Pandas

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy