2016-09-16 2 views
10

In dem Format, das mir gegeben wird, würde das Datum 2014-01-02 durch "20140102" dargestellt werden. Dies ist korrekt mit dem Standard strptime analysiert:Warum verursacht pythons datetime.datetime.strptime ('201412', '% Y% m% d') keinen ValueError?

>>> datetime.datetime.strptime("20140102", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

In diesem Format "201412" würde nicht ein gültiges Datum sein. Die docs sagen, dass die "% m" Direktive ist "Monat als eine Null gefüllte Dezimalzahl." Es gibt als Beispiele "01, 02, ..., 12". Die Tages-Direktive "% d" soll ebenfalls Null gepolstert sein.

Basierend darauf erwartete ich, dass "201412" eine ungültige Eingabe mit diesem Format wäre, würde also einen ValueError auslösen. Stattdessen wird es als 2014.01.02 interpretiert:

>>> datetime.datetime.strptime("201412", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

Die Frage ist: Gibt es eine Möglichkeit geben „keine ernsthaft mit Nullen aufgefüllt nur“? Oder missverstehe ich in diesem Zusammenhang den Begriff "zero-padded"?

Beachten Sie, dass es nicht darum geht, Daten in diesem Format zu analysieren, sondern um das Verhalten von strptime zu verstehen.

+0

Dies ist wirklich nicht helfen, aber es ist etwas verwandte (man denke '/' getrennte Felder) [Parsing Nicht-Null gepolsterte Zeitstempel in Python] (http://stackoverflow.com/ Fragen/25279993/Parsing-nicht-Null-gepolstert-Timestamps-in-Python) – metatoaster

+0

Ich denke, es hängt von dem regulären Ausdruck die Funktion verwendet – kiviak

+0

Sieht aus wie einige zusätzliche Erklärung in den Python-Dokumenten wäre nett. Ist garantiert, dass 'strptime (" 2014123 ","% Y% m% d ") immer" datetime "(2014, 12, 3, 0, 0) oder" datetime "(2014, 1, 23, 0, 0) '? – Matthias

Antwort

5

Nach dem Stand der issue auf dem Python-Tracker, mit dem Beispiel, wie eine solche zu sein (auf diese Frage ein bisschen eine Modifikation, aber das Konzept ist das gleiche):

>>> datetime.datetime.strptime('20141110', '%Y%m%d').isoformat() 
'2014-11-10T00:00:00' 
>>> datetime.datetime.strptime('20141110', '%Y%m%d%H%M').isoformat() 
'2014-01-01T01:00:00' 

Das oben beschriebene Verhalten ist bestimmt nicht ein Fehler wie von this comment erläutert, die besagt, dass sie die OpenGroup strptime standard entsprechen, die angibt, dass "führende Nullen zulässig, aber nicht erforderlich sind.".

Ich denke, die Problemumgehung besteht darin, Regex zu verwenden oder zu überprüfen, dass die Länge der Zeichenfolge der Länge 8 vor dem Übergang in strptime ist.

1

Das ist ziemlich schwierig, aber es klingt wie strptime versucht nur, die Zeichenfolge so genau wie möglich zu entsprechen. Pythons strptime ist die gleiche wie C des strptime und die docs sagen, dass Polsterung ist optional:

ist der Monat Nummer [1,12]; führende Nullen sind erlaubt, aber nicht erforderlich.

http://pubs.opengroup.org/onlinepubs/7908799/xsh/strptime.html

Verwandte Themen