datetime.strptime(‘2017-01-12T14:12:06.000-0500’,'%Y-%m-%dT%H:%M:%S.%f%Z')

坚强是说给别人听的谎言 提交于 2021-02-07 03:53:19

问题


I've been trying to convert this specific date format to a string in Python like so:

datetime.strptime(‘2017-01-12T14:12:06.000-0500’,'%Y-%m-%dT%H:%M:%S.%f%Z')

But it doesn't work.

What am I doing wrong?


回答1:


Solution for Python 2.7

From the comments it became clear that OP needs a solution for Python 2.7.

Apparently, there's no %z in strptime for python 2.7 even though the documentation claims the contrary, the raised error is ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.000%z'.

To solve this, you need to parse the date without timezone first and add the timezone later. Unfortunately you need to subclass tzinfo for that. This answer is based on this answer

from datetime import datetime, timedelta, tzinfo

class FixedOffset(tzinfo):
    """offset_str: Fixed offset in str: e.g. '-0400'"""
    def __init__(self, offset_str):
        sign, hours, minutes = offset_str[0], offset_str[1:3], offset_str[3:]
        offset = (int(hours) * 60 + int(minutes)) * (-1 if sign == "-" else 1)
        self.__offset = timedelta(minutes=offset)
        # NOTE: the last part is to remind about deprecated POSIX GMT+h timezones
        # that have the opposite sign in the name;
        # the corresponding numeric value is not used e.g., no minutes
        '<%+03d%02d>%+d' % (int(hours), int(minutes), int(hours)*-1)
    def utcoffset(self, dt=None):
        return self.__offset
    def tzname(self, dt=None):
        return self.__name
    def dst(self, dt=None):
        return timedelta(0)
    def __repr__(self):
        return 'FixedOffset(%d)' % (self.utcoffset().total_seconds() / 60)

date_with_tz = "2017-01-12T14:12:06.000-0500"
date_str, tz = date_with_tz[:-5], date_with_tz[-5:]
dt_utc = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S.%f")
dt = dt_utc.replace(tzinfo=FixedOffset(tz))
print(dt)

The last line prints:

2017-01-12 14:12:06-05:00



回答2:


The error was that you used %Z instead of %z. From the documentation, you should use %z to match e.g. (empty), +0000, -0400, +1030

import datetime

result = datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.%f%z')

print(result)

Output

2017-01-12 14:12:06-05:00



回答3:


Task:

"convert this specific date format to a string in Python"

import datetime  

Solution:

First modify your datetime.strptime code as follows:

  obj = datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.%f%z')

This is a useful site for your reference and will help you modify the output as per your preference.

Then use strftime to convert it to a string:

obj.strftime("%b %d %Y %H:%M:%S")

Out:

'Jan 12 2017 14:12:06'



回答4:


Assuming Python 3, the format %f may not be a valid format character for strptime on your platform. The strptime docs reference strftime for the formats, and %f isn't in the strftime list. However, the format string reference says that

The full set of format codes supported varies across platforms, because Python calls the platform C library’s strftime() function, and platform variations are common.

On my test system, which is Cygwin with Py 3.4.5, I used:

import datetime
datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.%f%Z')

and got

ValueError: time data '2017-01-12T14:12:06.000-0500' does not match format '%Y-%m-%dT%H:%M:%S.%f%Z'

I checked the man pages for strftime(3) and found that I don't have %f, and %z should be lowercase. I therefore used

datetime.datetime.strptime('2017-01-12T14:12:06.000-0500','%Y-%m-%dT%H:%M:%S.000%z')
#          straight quotes ^ not curly                  ^
#                                                      literal .000 (no %f) ^^^^ 
#                                                                  lowercase %z ^^

and got a successful parse.

Edit @Tagc found that %f worked fine running under Python 3.5 in PyCharm on a Windows 10 machine.




回答5:


Having date as the input str:

from dateutil import parser
parsed_date = parser.parse(date)

python-transforming-twitter




回答6:


If you don't have timezone information, replacing the '%Z' with 'Z' works in Python 3.

datetime.strptime('2010-10-04T03:41:22.858Z','%Y-%m-%dT%H:%M:%S.%fZ')
# datetime.datetime(2010, 10, 4, 3, 41, 22, 858000)



回答7:


if it is a string, e.g. load from a JSON file, you can try

date = '2017-01-12T14:12:06.000-0500'

print(date = date[:10]+" "+date[11:19])

returns:

2017-01-12 14:12:06


来源:https://stackoverflow.com/questions/41684991/datetime-strptime-2017-01-12t141206-000-0500-y-m-dthms-fz

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!