Pandas Value-Error: данные времени «nan» не соответствуют формату при использовании read_csv с date_parser и комментарием

Я использую: Python 3.7.2 и Pandas 0.24.2 И пытаюсь прочитать следующие данные (data.txt). Разделенный пробелом, первый столбец должен анализироваться как объекты даты и времени:

       #00:00:00               col0       col1
       2019-03-28_08:58:00     1064      31965
       2019-03-28_09:08:00     1084      32565
       !2019-03-28_09:18:00    1104      33165
       2019-03-28_09:28:00     1124      33765

с пандами read_csv как:

import pandas as pd
import datetime 

def date_parser (s):
    return datetime.datetime.strptime(str(s),'%Y-%m-%d_%H:%M:%S')

df      = pd.read_csv(filepath_or_buffer='data.txt',
                      delim_whitespace = True,
                      index_col='#00:00:00',
                      parse_dates=True,
                      date_parser=date_parser,
                      comment='!',
                      )

Все строки, начинающиеся со специального символа (здесь: !), следует пропустить. Это может быть любой другой персонаж. Но с закомментированной строкой я всегда получаю сообщение об ошибке:

ValueError: данные времени 'nan' не соответствуют формату '%Y-%m-%d_%H:%M:%S'

Я благодарен за любые идеи


person neo    schedule 09.05.2019    source источник
comment
Вы уверены, что проблема не в другой строке (не показанной в примере ввода)? Кажется, это работает нормально.   -  person Shaido    schedule 09.05.2019
comment
ошибка возникает, когда я вставляю ! в 3-й строке данных. Без этого работает. Я использовал точно такой же код и пример ввода.   -  person neo    schedule 09.05.2019


Ответы (2)


Код примера, который вы предоставили, отлично работает для меня. Я использую ту же версию Pandas, что и вы, и Python 3.7:

Работает...

Я удалил лишние пробелы из предоставленного вами входного файла:

#00:00:00 col0 col1
2019-03-28_08:58:00 1064 31965
2019-03-28_09:08:00 1084 32565
!2019-03-28_09:18:00 1104 33165
2019-03-28_09:28:00 1124 33765
person Nick Martin    schedule 09.05.2019
comment
Спасибо... Проблема в пробелах. Как вы предложили с удалением избыточных пробелов, это работает. Источник предоставляет его таким образом, чтобы его можно было прочитать в любом текстовом редакторе. Но это, кажется, проблема с повторным разбором. - person neo; 09.05.2019

Попробуйте этот подход:

df.columns = ["date", "c1", "c2"]
df.head()

date    c1  c2
0   2019-03-28_08:58:00 1064    31965
1   2019-03-28_09:08:00 1084    32565
2   2019-03-28_09:18:00 1104    33165
3   2019-03-28_09:28:00 1124    33765

df.dtypes
date    object
c1       int64
c2       int64
dtype: object

df.date = pd.to_datetime(df.date, format='%Y-%m-%d_%H:%M:%S')

df.dtypes

date    datetime64[ns]
c1               int64
c2               int64
dtype: object

После этого вы также можете выполнять эти операции для извлечения года, часа или даты, например: df.date.dt.year df.date.dt.hour или df.date.dt.date

person ashish14    schedule 09.05.2019
comment
Большое спасибо. Этот подход также прекрасно работает, только я надеялся, что смогу сделать все за один раз. Пробел был проблемой. - person neo; 09.05.2019