2016-09-16 14 views
10

W podanym formacie data 2014-01-02 będzie reprezentowana przez "20140102". To jest właściwie analizowany ze standardowym strptime:Dlaczego wartości Pythona datetime.datetime.strptime ("201412", "% Y% m% d") nie powodują błędu ValueError?

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

W tym formacie, „201412” to nie być ważna data. docs mówi, że dyrektywa "% m" to "Miesiąc jako liczba dziesiętna z wyściełaną zerą". Podaje jako przykłady "01, 02, ..., 12". Dyrektywa "% d" również ma mieć zerowy margines.

podstawie tego, spodziewałem się, że „201412” byłby nieważny z tego formatu wejściowego, tak by podnieść ValueError. Zamiast tego, jest interpretowany jako 2014-01-02:

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

Pytanie brzmi: czy jest jakiś sposób, aby określić „no poważnie zero-wyściełane tylko”? Czy nie rozumiem w tym kontekście terminu "zero-watded"?

Należy zauważyć, że pytanie nie jest o tym, jak analizować datę w tym formacie, ale o zrozumienie zachowania strptime.

+0

nie naprawdę pomóc, ale jest nieco pokrewny (myślę '/' pola oddzielone) [Analizowanie non-zerami znacznik czasu w python] (http://stackoverflow.com/ pytania/25279993/parsowanie-nie-zero-wyściełane-sygnatury czasowe-w-pythonie) – metatoaster

+0

Myślę, że to zależy od zwykłego wyrażenia, którego funkcja używa. – kiviak

+0

Wygląda na to, że pewne dodatkowe wyjaśnienie w dokumentach Pythona byłoby miłe. Czy jest zagwarantowane, że 'strptime (" 2014123 ","% Y% m% d ")' zawsze da 'datetime (2014, 12, 3, 0, 0)' lub może to być 'datetime (2014, 1, 23, 0, 0) "? – Matthias

Odpowiedz

5

według stanu issue na śledzenia Pythonowego z przykładem jest jak takie (kawałka modyfikacji tej kwestii, jednak pojęcie to jest dokładnie to samo)

>>> 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' 

Powyższy zachowanie zdecydowany być nie bug jak wyjaśnił this comment którym stwierdza się, że są one zgodne z OpenGroup strptime standard który stanowi, że „zera wiodące są dozwolone, ale nie jest wymagane.”.

Domyślam się, że obejście tego problemu polega na użyciu polecenia regex lub sprawdzeniu, czy długość łańcucha ma długość 8, zanim przejdzie w strptime.