Analysieren Sie die Datumszeichenfolge und ändern Sie das Format

113

Ich habe eine Datumszeichenfolge im Format 'Mon Feb 15 2010'. Ich möchte das Format auf '15 / 02/2010 'ändern. Wie kann ich das machen?

Nimmy
quelle
Duplikat von all diesen: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Genaues Duplikat davon: stackoverflow.com/questions/1713594/…
S.Lott

Antworten:

152

datetime Modul könnte Ihnen dabei helfen:

datetime.datetime.strptime(date_string, format1).strftime(format2)

Für das spezifische Beispiel könnten Sie tun

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>
SilentGhost
quelle
2
datetime.datetime (Montag, 15. Februar 2010, "% a% b% d% Y"). strftime ("% d /% m /% Y") Ist es korrekt? aber ich habe einen Fehler bekommen.
Nimmy
1
@nimmyliji: Es wurde 10 Minuten vor dem Posten Ihres Kommentars behoben. und natürlich solltest du date_stringals string haben.
SilentGhost
3
ein voll funktionsfähiges Beispiel bitte;) Welcher Import / ... ist erforderlich?
Codeling
format1muss eine Zeichenfolge sein, um das Format der Eingabe-Datumszeichenfolge auszudrücken. format2ist das auszugebende Zielzeichenfolgenformat.
ThorSummoner
1
Können Sie näher erläutern, wie format1 in diesem Beispiel aussehen soll?
user1767754
59

Sie können die dateutil- Bibliothek installieren . Seine parseFunktion kann herausfinden, in welchem ​​Format eine Zeichenfolge vorliegt, ohne dass Sie das Format angeben müssen, mit dem Sie arbeiten datetime.strptime.

from dateutil.parser import parse
dt = parse('Mon Feb 15 2010')
print(dt)
# datetime.datetime(2010, 2, 15, 0, 0)
print(dt.strftime('%d/%m/%Y'))
# 15/02/2010
llazzaro
quelle
dateutil.parse ist eine bessere Alternative, wenn das genaue Format einer zulässigen ISO-Zeichenfolge unbekannt ist. ISO kann Mikrosekunden enthalten oder nicht. Es kann nachfolgendes "Z" enthalten oder nicht. datetime.strptime ist nicht flexibel genug, um dies zu berücksichtigen.
Michael Kariv
4
Pase Date sollte mit Vorsicht verwendet werden. parse ('12 .07.2017 ') gibt datetime (2017, 12, 7, ..) zurück, parse ('13 .07.2017') gibt jedoch .datetime (2017, 7, 13, ...) zurück
ego2dot0
In python 3.xmuss installiert werdenpython-dateutil pip install python-dateutil
AB Abhi
24
>>> from_date="Mon Feb 15 2010"
>>> import time                
>>> conv=time.strptime(from_date,"%a %b %d %Y")
>>> time.strftime("%d/%m/%Y",conv)
'15/02/2010'
Ghostdog74
quelle
22

Zeichenfolge in Datum / Uhrzeit-Objekt konvertieren

from datetime import datetime
s = "2016-03-26T09:25:55.000Z"
f = "%Y-%m-%dT%H:%M:%S.%fZ"
out = datetime.strptime(s, f)
print(out)
output:
2016-03-26 09:25:55
anjaneyulubatta505
quelle
Dies entspricht nicht dem Format, das er gefragt hat und das eine Monatszeichenfolge "Feb" enthält.
Shahir Ansari
@ ShahirAnsari können Sie das Format ändern, wie Sie möchten, siehe " docs.python.org/3/library/datetime.html "
anjaneyulubatta505
14

Da diese Frage häufig gestellt wird, finden Sie hier die einfache Erklärung.

datetimeoder timeModul hat zwei wichtige Funktionen.

  • strftime - eine Zeichenfolgendarstellung von Datum oder Uhrzeit aus einem Datum / Uhrzeit- oder Zeitobjekt.
  • strptime - Erstellt aus einer Zeichenfolge ein Datum / Uhrzeit- oder Zeitobjekt.

In beiden Fällen benötigen wir eine Formatierungszeichenfolge. Es ist die Darstellung, die angibt, wie das Datum oder die Uhrzeit in Ihrer Zeichenfolge formatiert ist.

Nehmen wir nun an, wir haben ein Datumsobjekt.

>>> from datetime import datetime
>>> d = datetime(2010, 2, 15)
>>> d
datetime.datetime(2010, 2, 15, 0, 0)

Wenn wir ab diesem Datum eine Zeichenfolge im Format erstellen möchten 'Mon Feb 15 2010'

>>> s = d.strftime('%a %b %d %y')
>>> print s
Mon Feb 15 10

Nehmen wir an, wir möchten dies serneut in ein datetimeObjekt konvertieren .

>>> new_date = datetime.strptime(s, '%a %b %d %y')
>>> print new_date
2010-02-15 00:00:00

In diesem Dokument finden Sie alle Formatierungsanweisungen bezüglich Datum / Uhrzeit.

thavan
quelle
Ich liebe deine Erklärung.
Enchance
2

Nur zur Vervollständigung: Beim Parsen eines Datums mit strptime()und das Datum enthält den Namen eines Tages, Monats usw. enthält, müssen Sie das Gebietsschema berücksichtigen.

Es wird auch in den Dokumenten als Fußnote erwähnt .

Als Beispiel:

import locale
print(locale.getlocale())

>> ('nl_BE', 'ISO8859-1')

from datetime import datetime
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> ValueError: time data '6-Mar-2016' does not match format '%d-%b-%Y'

locale.setlocale(locale.LC_ALL, 'en_US')
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> '2016-03-06'
ƘɌỈSƬƠƑ
quelle
2

@codeling und @ user1767754: Die folgenden zwei Zeilen funktionieren. Ich habe gesehen, dass niemand die vollständige Lösung für das angeforderte Beispielproblem veröffentlicht hat. Hoffentlich ist das genug Erklärung.

import datetime

x = datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m/%Y")
print(x)

Ausgabe:

15/02/2010
Gobryas
quelle
1

Sie können dies auch mit Pandas erreichen:

import pandas as pd

pd.to_datetime('Mon Feb 15 2010', format='%a %b %d %Y').strftime('%d/%m/%Y')

Ausgabe:

'15/02/2010'

Sie können den Pandas-Ansatz für verschiedene Datentypen anwenden:

import pandas as pd
import numpy as np

def reformat_date(date_string, old_format, new_format):
    return pd.to_datetime(date_string, format=old_format, errors='ignore').strftime(new_format)

date_string = 'Mon Feb 15 2010'
date_list = ['Mon Feb 15 2010', 'Wed Feb 17 2010']
date_array = np.array(date_list)
date_series = pd.Series(date_list)

old_format = '%a %b %d %Y'
new_format = '%d/%m/%Y'

print(reformat_date(date_string, old_format, new_format))
print(reformat_date(date_list, old_format, new_format).values)
print(reformat_date(date_array, old_format, new_format).values)
print(date_series.apply(lambda x: reformat_date(x, old_format, new_format)).values)

Ausgabe:

15/02/2010
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
flink
quelle