ValueError: данные времени '10 / 11/2006 24:00 'не соответствуют формату'% d /% m /% Y% H:% M ' - PullRequest
0 голосов
/ 07 октября 2018

Я пытался:

df["datetime_obj"] = df["datetime"].apply(lambda dt: datetime.strptime(dt, "%d/%m/%Y %H:%M"))

, но получил эту ошибку:

ValueError: данные времени '10 / 11/2006 24:00 'не соответствуют формату'% d/% m /% Y% H:% M '

Как решить это правильно?

Ответы [ 3 ]

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

Причина, по которой это не работает, заключается в том, что параметр %H принимает значения только в диапазоне от 00 до 23 (оба включительно).Таким образом, это означает, что 24:00 - как говорит ошибка - не является допустимой временной строкой.

Я думаю, поэтому у нас не так много других вариантов, кроме как преобразовать строку в допустимый формат.Мы можем сделать это, сначала заменив 24:00 на 00:00, а затем увеличивая день для этих отметок времени.

Как:

from datetime import timedelta
import pandas as pd

df['datetime_zero'] = df['datetime'].str.replace('24:00', '0:00')
df['datetime_er'] = pd.to_datetime(df['datetime_zero'], format='%d/%m/%Y %H:%M')
selrow = df['datetime'].str.contains('24:00')
df['datetime_obj'] = df['datetime_er'] + selrow * timedelta(days=1)

Последняя строка добавляет один день кстроки, содержащие 24:00, так что '10/11/2006 24:00' преобразуется в '11/11/2006 24:00'.Однако обратите внимание, что вышеприведенное довольно небезопасно , поскольку в зависимости от формата отметки времени это будет / не будет работать.Для вышеупомянутого это будет (вероятно) работать, так как есть только одна двоеточие.Но если, например, у datetime есть также секунды, фильтр может сработать для 00:24:00, поэтому для его работы может потребоваться дополнительная работа.

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

Ваши данные не соответствуют соглашениям, используемым объектами Python / Pandas datetime.Должен быть только один способ хранения конкретного datetime, то есть '10/11/2006 24:00' должен быть переписан как '11/11/2006 00:00'.

Вот один из способов решения проблемы:

# find datetimes which have '24:00' and rewrite
twenty_fours = df['strings'].str[-5:] == '24:00'
df.loc[twenty_fours, 'strings'] = df['strings'].str[:-5] + '00:00'

# construct datetime series
df['datetime'] = pd.to_datetime(df['strings'], format='%d/%m/%Y %H:%M')

# add one day where applicable
df.loc[twenty_fours, 'datetime'] += pd.DateOffset(1)

Вотнекоторые данные для проверки:

dateList = ['10/11/2006 24:00', '11/11/2006 00:00', '12/11/2006 15:00']
df = pd.DataFrame({'strings': dateList})

Результат после описанных выше преобразований:

print(df['datetime'])

0   2006-11-11 00:00:00
1   2006-11-11 00:00:00
2   2006-11-12 15:00:00
Name: datetime, dtype: datetime64[ns]
0 голосов
/ 07 октября 2018

Как указано в документации (https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior), часы идут с 00 до 23. В этом случае ошибка 24:00.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...