Неизвестный строковый формат в pd.to_datetime

У меня есть набор данных с такой датой столбца:

cod           date              value 
0   1O8        2015-01-01 00:00:00    2.1
1   1O8        2015-01-01 01:00:00    2.3
2   1O8        2015-01-01 02:00:00    3.5
3   1O8        2015-01-01 03:00:00    4.5
4   1O8        2015-01-01 04:00:00    4.4
5   1O8        2015-01-01 05:00:00    3.2
6   1O9        2015-01-01 00:00:00    1.4
7   1O9        2015-01-01 01:00:00    8.6
8   1O9        2015-01-01 02:00:00    3.3
10  1O9        2015-01-01 03:00:00    1.5
11  1O9        2015-01-01 04:00:00    2.4
12  1O9        2015-01-01 05:00:00    7.2

dtypes столбца даты является объектом для применения некоторой функции после того, как мне нужно изменить тип столбца даты на datatime. Я пробую другое решение, например:

pd.to_datetime(df['date'], errors='raise', format ='%Y-%m-%d HH:mm:ss')
pd.to_datetime(df['date'], errors='coerce', format ='%Y-%m-%d HH:mm:ss')
df['date'].apply(pd.to_datetime, format ='%Y-%m-%d HH:mm:ss')

Но ошибка только та же:

TypeError: Unrecognized value type: <class 'str'>
ValueError: Unknown string format

Дело в том, что если я применяю функцию te к образцу набора данных, функция реагирует правильно, но если я применяю ее ко всему набору данных, выхожу из ошибки. В данных отсутствует пропущенное значение, а dtype одинаков для всех значений.

Как я могу исправить эту ошибку?

Вы пробовали без указания формата, например pd.to_datetime(df.date)?

yatu 29.11.2018 12:05

Да, это первое, что я попробовал

jjgasse 29.11.2018 12:06

Потому что обычно это подразумевает формат. И, как упоминает @jpp, вам не хватает % в начале строковых форматов.

yatu 29.11.2018 12:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
8
3
14 926
2

Ответы 2

Есть три проблемы:

  1. pd.to_datetime и pd.Series.apply не работают, поэтому ваши решения не изменят вашу серию. Назначить обратно после преобразования.
  2. Третье решение требует наличия errors='coerce', чтобы гарантировать отсутствие ошибок.
  3. Для компонента времени вам необходимо использовать определенные строковые форматы, начиная с %.

Итак, вы можете использовать:

df = pd.DataFrame({'date': ['2015-01-01 00:00:00', '2016-12-20 15:00:20',
                            '2017-08-05 00:05:00', '2018-05-11 00:10:00']})

df['date'] = pd.to_datetime(df['date'], errors='coerce', format='%Y-%m-%d %H:%M:%S')

print(df)

                  date
0  2015-01-01 00:00:00
1  2016-12-20 15:00:20
2  2017-08-05 00:05:00
3  2018-05-11 00:10:00

В данном конкретном случае формат является стандартным, и его можно не указывать:

df['date'] = pd.to_datetime(df['date'], errors='coerce')

Я попытался использовать этот тип формата: format='%Y-%m-%d %H:%M:%S.%f' , но теперь ошибка: ValueError: time data 'dVal' doesn't match format specified. Теоретически формат правильный

jjgasse 29.11.2018 14:22

@jjgasse, ваши входы не соответствуют вашему формату, см. мой пример, там нет .%f. И похоже, что вы, все еще, не используете errors='coerce'.

jpp 29.11.2018 14:31

Я так понимаю, вы читаете эти данные, например, из файла csv.

df=pd.read_csv('c:/1/comptagevelo2012.csv', index_col=0, parse_dates=True)

Проверять:

print(df.index) 

Работает лучше, чем pd.to_datetime !! Я проверил это!

> DatetimeIndex(['2012-01-01', '2012-02-01', '2012-03-01', '2012-04-01',
>                '2012-05-01', '2012-06-01', '2012-07-01', '2012-08-01',
>                '2012-09-01', '2012-10-01',
>                ...
>                '2012-12-22', '2012-12-23', '2012-12-24', '2012-12-25',
>                '2012-12-26', '2012-12-27', '2012-12-28', '2012-12-29',
>                '2012-12-30', '2012-12-31'],
>               dtype='datetime64[ns]', length=366, freq=None)

Другой метод для этого файла не работает.

df=pd.read_csv('c:/1/comptagevelo2012.csv',index_col=0)
pd.to_datetime(df['Date'],  errors='coerce', format ='%d/%m/%Y')
print(df.index)

Index(['01/01/2012', '02/01/2012', '03/01/2012', '04/01/2012', '05/01/2012',
       '06/01/2012', '07/01/2012', '08/01/2012', '09/01/2012', '10/01/2012',
       ...
       '22/12/2012', '23/12/2012', '24/12/2012', '25/12/2012', '26/12/2012',
       '27/12/2012', '28/12/2012', '29/12/2012', '30/12/2012', '31/12/2012'],
      dtype='object', length=366)

колдовство: https://keyrus-gitlab.ml/gfeuillen/keyrus-training/blob/5f0076e3c61ad64336efc9bc3fd862bfed53125c/docker/data/python/Exercises/02%20pandas/comptagevelo2012.csv

Другие вопросы по теме