Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert Python's .isoformat() string back into datetime object [duplicate]

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 '2015-02-04T20:55:08.914461+00:00'  >>> 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:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime     tt, fraction = _strptime(data_string, format)   File "C:\Python34\Lib\_strptime.py", 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: (https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)

%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.

like image 630
Alex Urcioli Avatar asked Feb 04 '15 21:02

Alex Urcioli


People also ask

How do I convert datetime to Isoformat?

Custom DateTime Format Stringsvar output = localTime. ToString("yyyy-MM-ddTHH:mm:ssK"); var output = localTime. ToString("yyyy-MM-ddTHH:mm:ssK");

How do I use Isoformat in Python?

To get an ISO 8601 date in string format in Python 3, you can simply use the isoformat function. It returns the date in the ISO 8601 format. For example, if you give it the date 31/12/2017, it'll give you the string '2017-12-31T00:00:00'.


1 Answers

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 

Then...

import datetime import dateutil  def getDateTimeFromISO8601String(s):     d = dateutil.parser.parse(s)     return d 
like image 80
Alex Urcioli Avatar answered Sep 20 '22 11:09

Alex Urcioli