You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When using datetime.strptime or time.strptime to parse string representing timestamp with the format string '%Y%m%dT%H%M%S' then a strange behavior happens when the input string does not contain the seconds: the minute part is split and first digit used as minutes and second digit as seconds !
According to documentation %M shall contain Minute as a decimal number [00,59] and %S shall contain Second as a decimal number [00,61]
Here are few examples to show this:
------------------
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> datetime.datetime.strptime('20110817T1234','%Y%m%dT%H%M%S')
datetime.datetime(2011, 8, 17, 12, 3, 4)
=>ERROR no seconds in input string: minute=3, second=4
=>I would expect exception ValueError or datetime.datetime(2011, 8, 17, 12, 34, 00)
>>> datetime.datetime.strptime('20110817T123456','%Y%m%dT%H%M%S')
datetime.datetime(2011, 8, 17, 12, 34, 56)
=>CORRECT
>>> datetime.datetime.strptime('20110817T123456','%Y%m%dT%H%M')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/_strptime.py", line 328, in _strptime
data_string[found.end():])
ValueError: unconverted data remains: 56
=>CORRECT
>>> datetime.datetime.strptime('20110817T1234','%Y%m%dT%H%M')
datetime.datetime(2011, 8, 17, 12, 34)
=> CORRECT
I have tested this with python 2.6 and 2.7
This also happens on when playing with %H%M format string and omit minutes from the input.
ERROR no seconds in input string: minute=3, second=4
If you specificy "%S" in the format string, strptime() *requires* seconds. If seconds are optional in your format, you should call strptime() twice: first without '%S', then with '%S' if the first failed.
20110817T1234 without seconds => 2011-08-17 12:34:00
20110817T12345 with seconds => 2011-08-17 12:34:05
20110817T123456 with seconds => 2011-08-17 12:34:56
Reacted by abduqodir
heidarrafn commented on Sep 5, 2011
heidarrafnmannequin
MannequinAuthor
More actions
My understanding of the python documentation and the ISO 8601 standard is that the digits in a timestamp representing hours, minutes and seconds shall always be in pairs of 2 digits (hh, mm, ss), i.e. when a number is less than 10 it should be preceded by 0.
In the example I give, the minute figure is split between minutes and seconds by the python library function which I consider a bug:
datetime.datetime.strptime('20110817T1234','%Y%m%dT%H%M%S')
gives
datetime.datetime(2011, 8, 17, 12, 3, 4)
I have attached a patch for this issue, so that if the format of the input argument doesn't match ISO 8601 format, it will return ValueError: time data xxx does not match format xxx.
hieunguyen commented on Oct 23, 2012
hieunguyenmannequin
Mannequin
More actions
Attached another patch for clearer test cases against this fix (as suggested from Ezio).
Activity
heidarrafn commentedon Sep 2, 2011
When using datetime.strptime or time.strptime to parse string representing timestamp with the format string '%Y%m%dT%H%M%S' then a strange behavior happens when the input string does not contain the seconds: the minute part is split and first digit used as minutes and second digit as seconds !
According to documentation %M shall contain Minute as a decimal number [00,59] and %S shall contain Second as a decimal number [00,61]
Here are few examples to show this:
------------------
I have tested this with python 2.6 and 2.7
This also happens on when playing with %H%M format string and omit minutes from the input.
vstinner commentedon Sep 2, 2011
If you specificy "%S" in the format string, strptime() *requires* seconds. If seconds are optional in your format, you should call strptime() twice: first without '%S', then with '%S' if the first failed.
I don't consider your examples as bugs.
vstinner commentedon Sep 2, 2011
Example:
---
Output:
20110817T1234 without seconds => 2011-08-17 12:34:00
20110817T12345 with seconds => 2011-08-17 12:34:05
20110817T123456 with seconds => 2011-08-17 12:34:56
heidarrafn commentedon Sep 5, 2011
My understanding of the python documentation and the ISO 8601 standard is that the digits in a timestamp representing hours, minutes and seconds shall always be in pairs of 2 digits (hh, mm, ss), i.e. when a number is less than 10 it should be preceded by 0.
In the example I give, the minute figure is split between minutes and seconds by the python library function which I consider a bug:
datetime.datetime.strptime('20110817T1234','%Y%m%dT%H%M%S')
gives
datetime.datetime(2011, 8, 17, 12, 3, 4)
heidarrafn commentedon Sep 5, 2011
This issue is also discussed here: http://bugs.python.org/issue5979
hieunguyen commentedon Oct 23, 2012
I have attached a patch for this issue, so that if the format of the input argument doesn't match ISO 8601 format, it will return ValueError: time data xxx does not match format xxx.
hieunguyen commentedon Oct 23, 2012
Attached another patch for clearer test cases against this fix (as suggested from Ezio).
5 remaining items
gh-57095: Add note about input splitting in `datetime.*.strptime` (GH…
pythongh-57095: Add note about input splitting in `datetime.*.strptim…
pythongh-57095: Add note about input splitting in `datetime.*.strptim…
[3.14] gh-57095: Add note about input splitting in `datetime.*.strpti…
[3.13] gh-57095: Add note about input splitting in `datetime.*.strpti…
pythongh-57095: Add note about input splitting in `datetime.*.strptim…
pythongh-57095: Add note about input splitting in `datetime.*.strptim…
pythongh-57095: Add note about input splitting in `datetime.*.strptim…