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
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)):
‘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.
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
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 DOBhat 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
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):
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
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.
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
Peter Mortensen
Sie können dies versuchen. Es konvertiert das Datumsformat in TT-MM-JJJJ:
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
Peter Mortensen
Der folgende Code ändert sich in den Typ „datetime“ und formatiert auch in der angegebenen Formatzeichenfolge.
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