Analysieren von nicht null gepolsterten Zeitstempeln in Python


83

Ich möchte Datumsangaben von Zeitstempeln wie den folgenden erhalten: 3/1/2014 9:55mit datetime.strptimeoder etwas Äquivalentem.

Der Monat, der Tag des Monats und die Stunde sind nicht mit Nullen aufgefüllt, aber es scheint keine hier aufgeführte Formatierungsanweisung zu geben, die dies automatisch analysieren kann.

Was ist der beste Ansatz dafür? Vielen Dank!

Antworten:


130

strptimekann nicht aufgefüllte Werte analysieren. Die Tatsache, dass sie in der Tabelle mit den Formatierungscodes als aufgefüllt vermerkt sind, gilt für strftimedie Ausgabe. Sie können also einfach verwenden

datetime.strptime(datestr, "%m/%d/%Y %H:%M")

8

strptimeisdo benötigt keine 0-aufgefüllten Werte. Siehe Beispiel unten

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output:   datetime.datetime(2014, 3, 1, 9, 55)

2

Nur für den Fall, dass diese Antwort jemand anderem hilft - ich kam hierher und dachte, ich hätte ein Problem mit Null-Polsterung, aber es hatte eigentlich mit 12:00 vs 00:00 und dem %IFormatierer zu tun .

Der %IFormatierer soll 12-Stunden-Stunden entsprechen, optional mit Nullen aufgefüllt. Abhängig von Ihrer Datenquelle erhalten Sie möglicherweise Daten, die besagen, dass Mitternacht oder Mittag tatsächlich Null ist, z.

>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'

Was strptimeeigentlich wollte, war eine 12, keine Null:

>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)

Wir kontrollieren aber nicht immer unsere Datenquellen! Meine Lösung für diesen Randfall bestand darin, die Ausnahme abzufangen und sie mit a zu analysieren %H, wobei schnell überprüft wurde, ob wir uns in dem Randfall befinden, in dem wir uns befinden.

def get_datetime(string):
    try:
        timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
    except ValueError:
        # someone used zero for midnight?
        timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
        assert string.lower().endswith('am')
        assert timestamp.hour == 0
    return timestamp

0:12amist eine ungültige Eingabe. Es sollte sein 12:12am. 11:59 pmwird gefolgt von 12:00 amnicht 0:00am. Es gibt verschiedene Möglichkeiten, Daten in einem falschen Zeitformat bereitzustellen, z. B. kann die Eingabe ein zweistelliges Jahr ( %y) anstelle eines vierstelligen Jahres ( %Y) verwenden oder ein Tag / Monat kann ausgetauscht werden ( %m/%dvs. %d/%m) usw. Der Tag / Der Fall eines Monats kann mehrdeutig sein, z. B. 2015/10/12"12. Oktober" oder "10. Dezember"? Übrigens sollten Sie %Y/%m/%danstelle von verwenden %m/%d/%Y, um Ihr Eingabeformat anzupassen .
JFS

Vielen Dank, mir ist klar, dass es sich um eine ungültige Eingabe handelt, wie ich bereits sagte, die aus einer Datenquelle stammt, die ich nicht kontrolliere.
HWJP

1

Die Methode ohne Muster ist das Verwendungsmodul dateutil.parse, mit dem die gängigen Datumsformate analysiert werden können, auch wenn Sie nicht wissen, was derzeit verwendet wird. Beispiel
:

>>> import dateutil.parser
>>> 
>>> utc_time     = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale  = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)

1

Sie können das Strftime-Dokument hier sehen , aber tatsächlich funktionieren nicht alle auf allen Plattformen gut. Zum Beispiel %-d,%-mfunktionieren Sie nicht mit Win7 von Python 2.7, also können Sie dies erreichen

>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())  
>>> print(date_str)
2016-5-23

1
In nativem Windows wird Hash durch Hash ersetzt: %#d, %#m. Aber sowohl Dash- als auch Hash-Mods werden nur in der String-Formatierung ( strftime) benötigt, nicht in Parsing ( strptime).
Nuno André
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.