How to convert Python”s .isoformat() string back into datetime object


So in Python 3, you can generate an ISO 8601 date with .isoformat(), but you can"t convert a string created by isoformat() back into a datetime object because Python"s own datetime directives don"t match properly. That is, %z = 0500 instead of 05:00 (which is produced by .isoformat()).

For example:

>>> strDate = d.isoformat()
>>> strDate

>>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:Python34Lib\", line 500, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "C:Python34Lib\", line 337, in _strptime
    (data_string, format))
ValueError: time data "2015-02-04T20:55:08.914461+00:00" does not match format "%Y-%m-%dT%H:%M:%S.%f%z"

From Python"s strptime documentation: (

%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive). (empty), +0000, -0400, +1030

So, in short, Python does not even adhere to its own string formatting directives.

I know datetime is already terrible in Python, but this really goes beyond unreasonable into the land of plain stupidity.

Tell me this isn"t true.

Answer rating: 88

Python 3.7+

As of Python 3.7 there is a method datetime.fromisoformat() which is exactly the reverse for isoformat().

Older Python

If you have older Python, then this is the current best "solution" to this question:

pip install python-dateutil


import datetime
import dateutil

def getDateTimeFromISO8601String(s):
    d = dateutil.parser.parse(s)
    return d

Get Solution for free from DataCamp guru