Python Pandas Ошибка атрибута to_datetime: объект «кортеж» не имеет атрибута «ниже»

#python #pandas

Вопрос:

У меня есть csv, состоящий из 6 столбцов, первый имеет определенное форматирование даты, поэтому мне нужно преобразовать его в формат США ГГГГ-мм-дд

после прочтения содержимого CSV-файла я продолжаю изменять столбец «дата», но продолжаю получать следующую ошибку

CSV

 Gmt time,Open,High,Low,Close,Volume
01.01.2021 00:00:00.000,1.22174,1.22174,1.22174,1.22174,0
01.01.2021 01:00:00.000,1.22174,1.22174,1.22174,1.22174,0
01.01.2021 02:00:00.000,1.22174,1.22174,1.22174,1.22174,0
01.01.2021 03:00:00.000,1.22174,1.22174,1.22174,1.22174,0
01.01.2021 04:00:00.000,1.22174,1.22174,1.22174,1.22174,0
 

питон

 import pandas as pd

df = pd.read_csv('history/EURUSDhours.csv')
df.columns = [['date','open','high','low','close','volume']]
df.date= pd.to_datetime((df.date),format='%d.%m.%Y %H:%M:%S.%f')
print(df.head)
 

ТИПЫ DTYPES

 date       object
open      float64
high      float64
low       float64
close     float64
volume      int64
dtype: object
 

ошибка

 Traceback (most recent call last):
  File "eurusd.py", line 5, in <module>
    df.date= pd.to_datetime((df.date),format='%d.%m.%Y %H:%M:%S.%f')
  File "venvlibsite-packagespandascoretoolsdatetimes.py", line 808, in to_datetime
    result = _assemble_from_unit_mappings(arg, errors, tz)
  File "venvlibsite-packagespandascoretoolsdatetimes.py", line 899, in _assemble_from_unit_mappings
    unit = {k: f(k) for k in arg.keys()}
  File "venvlibsite-packagespandascoretoolsdatetimes.py", line 899, in <dictcomp>
    unit = {k: f(k) for k in arg.keys()}
  File "venvlibsite-packagespandascoretoolsdatetimes.py", line 894, in f
    if value.lower() in _unit_map:
AttributeError: 'tuple' object has no attribute 'lower'
 

Комментарии:

1. df.columns = [['date','open','high','low','close','volume']] создаст столбец кортежа, удалит вложенность, чтобы иметь столбец строки

Ответ №1:

Проблема была преходящей list of list of elements to df.columns .

 import pandas as pd

df = pd.read_csv('history/EURUSDhours.csv')
df.columns = ['date','open','high','low','close','volume']
df.date= pd.to_datetime(df.date,format='%d.%m.%Y %H:%M:%S.%f')
df
 

Выход

     date    open    high    low close   volume
0   2021-01-01 00:00:00 1.22174 1.22174 1.22174 1.22174 0
1   2021-01-01 01:00:00 1.22174 1.22174 1.22174 1.22174 0
2   2021-01-01 02:00:00 1.22174 1.22174 1.22174 1.22174 0
3   2021-01-01 03:00:00 1.22174 1.22174 1.22174 1.22174 0
4   2021-01-01 04:00:00 1.22174 1.22174 1.22174 1.22174 0
 

Ответ №2:

Назначьте имена столбцов массиву с 1 измерением

 df.columns = ['date', 'open', 'high', 'low', 'close', 'volume']
 

Вы также можете позволить read_csv делать все

  • header чтобы не использовать заголовок файла
  • names чтобы дать новым именам col
  • parse_dates чтобы указать, какой анализ col на сегодняшний день
  • infer_datetime_dates может ускорить разбор дат
 df = pd.read_csv('file123.txt', header=0, 
                 names=['date', 'open', 'high', 'low', 'close', 'volume'],
                 parse_dates=['date'], infer_datetime_format=True)