Я получаю сообщение об ошибке при попытке проанализировать дату и время:

ValueError: ("time data '2019-07-05T10:19:42+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'", 'occurred at index 0')

Строка, которая генерирует эту ошибку:

df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'], '%Y-%m-%dT%H:%M:%S%z').strftime("%Y%m"), axis=1)

Насколько я вижу, формат правильный, и код отлично работает на других машинах.

Это работает, когда я удаляю% z из формата и просто беру часть данных для форматирования, например, как показано ниже:

df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'][:19], '%Y-%m-%dT%H:%M:%S').strftime("%Y%m"), axis=1)

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

Был бы очень признателен за понимание того, как это исправить, не используя ломтик!

0
Slushysnowman 5 Июл 2019 в 16:40

3 ответа

Лучший ответ

Хотя синтаксический анализ '% z' поддерживается Python 3.6, в следующем формате:

+HHMM or -HHMM

Он не поддерживает разбор «% z», если этот раздел даты содержит двоеточие:

+HH:MM or -HH:MM

Однако Python 3.7 поддерживает синтаксический анализ раздела «% z», если в этом разделе есть двоеточие.

Следовательно, использование Python 3.7 вместо Python 3.6 решит эту проблему.

0
Slushysnowman 8 Июл 2019 в 06:13

Функция Python 2 strptime() действительно не поддерживает формат% z для часовых поясов (поскольку базовая функция time.strptime () его не поддерживает). У вас есть два варианта:

Игнорировать часовой пояс при разборе с strptime:

time_obj = datetime.datetime.strptime(time_str[:19], '%Y-%m-%dT%H:%M:%S')

Используйте модуль dateutil, функция parse работает с часовыми поясами:

from dateutil.parser import parse
time_obj = parse(time_str)

Вы также можете перейти на Python 3.2 или более новую версию, где поддержка часового пояса была улучшена до такой степени, что %z будет работать, при условии, что вы удалили последнее: из входных данных и - из до % z

2
ncica 5 Июл 2019 в 13:46

Если можете, рассмотрите возможность использования dateutil:

import datetime
import dateutil.parser

my_date_str = '2019-07-05T10:19:42+00:00'
my_date = dateutil.parser.parse(my_date_str)
print(type(my_date)) # <class 'datetime.datetime'>  
print(my_date.strftime('%Y%m')) # 201907
2
Flo 5 Июл 2019 в 13:50