Что не так с моим форматом datetime.strptime? - PullRequest
0 голосов
/ 28 октября 2018

С этой функцией:

timestamp = datetime.strptime(date_str, date_fmt)

Я получаю эту ошибку:

ValueError: время данных 'Воскресенье, 28 октября 2018 г. 07:33:13 -0400 (EDT) 'не соответствует формату'% a,% d% b% Y% H:% M:% S% z (% Z) '

Sun, 28 Oct 2018 07:33:13 -0400 (EDT)
%a, %d %b %Y %H:%M:%S %z (%Z)

Я посмотрелза это десяток раз и я не могу понять, что я делаю неправильно.

Моя версия Python:

Python 3.7.0 (default, Jul 23 2018, 20:24:19) 

1 Ответ

0 голосов
/ 28 октября 2018

Нет поддержки %Z на входе для чего-либо, кроме вашего текущего часового пояса .Только строки в time.tzname кортеже плюс 'UTC' и 'GMT' будут когда-либо распознаваться:

>>> from datetime import datetime
>>> import time
>>> time.tzname
('GMT', 'BST')
>>> sample = 'Sun, 28 Oct 2018 07:33:13 -0400 (EDT)'
>>> datetime.strptime(sample.replace('EDT', time.tzname[0]), '%a, %d %b %Y %H:%M:%S %z (%Z)')
datetime.datetime(2018, 10, 28, 7, 33, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000), 'GMT'))
>>> datetime.strptime(sample.replace('EDT', time.tzname[1]), '%a, %d %b %Y %H:%M:%S %z (%Z)')
datetime.datetime(2018, 10, 28, 7, 33, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000), 'BST'))

Поскольку у вас также есть смещение от UTC в строке (-0400 часть), просто удалите название часового пояса из вашего ввода и не пытайтесь его проанализировать:

>>> datetime.strptime(sample.rpartition(' ')[0], '%a, %d %b %Y %H:%M:%S %z')
datetime.datetime(2018, 10, 28, 7, 33, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

Я использовал str.rpartition() здесь, чтобы удалить все, начиная споследний пробел, но это зависит от того, какие входные данные у вас есть, как наилучшим образом удалить часть имени часового пояса в вашем приложении.Без этого секция (%Z) не нужна, и вы получаете правильный объект datetime.

При отладке datetime.strptime() проблем вы хотите разделить проблему.Вы можете разделить входные данные и части шаблона, чтобы увидеть, в чем заключается проблема, или попробовать разные компоненты один за другим.Это может быть одна директива, которая вызывает проблему, или множественная, поэтому я обычно использую пошаговое удаление директив до тех пор, пока одна из них не сработает.

...