AttributeError: может использовать только .dt accessor с datetimelike значениями

Привет, я использую pandas для преобразования столбца в месяц. Когда я читаю свои данные, они являются объектами:

Date           object
dtype: object

Поэтому я сначала делаю их на дату, а затем пытаюсь сделать их месяцами:

import pandas as pd
file = '/pathtocsv.csv'
df = pd.read_csv(file, sep = ',', encoding='utf-8-sig', usecols= ['Date', 'ids'])    
df['Date'] = pd.to_datetime(df['Date'])
df['Month'] = df['Date'].dt.month

Также, если это помогает:

In [10]: df['Date'].dtype
Out[10]: dtype('O')

Итак, ошибка, которую я получаю, выглядит так:

/Library/Frameworks/Python.framework/Versions/2.7/bin/User/lib/python2.7/site-packages/pandas/core/series.pyc in _make_dt_accessor(self)
   2526             return maybe_to_datetimelike(self)
   2527         except Exception:
-> 2528             raise AttributeError("Can only use .dt accessor with datetimelike "
   2529                                  "values")
   2530 

AttributeError: Can only use .dt accessor with datetimelike values

EDITED:

Столбцы даты выглядят следующим образом:

0         2014-01-01         
1         2014-01-01         
2         2014-01-01         
3         2014-01-01         
4         2014-01-03       
5         2014-01-03         
6         2014-01-03         
7         2014-01-07         
8         2014-01-08         
9         2014-01-09 

Есть ли у вас идеи? Большое спасибо!

Ответ 1

Ваша проблема здесь в том, что to_datetime молча провалился, поэтому dtype остался как str/object, если вы установите param errors='coerce', то если преобразование не удастся для какой-либо конкретной строки, тогда эти строки будут установлены в NaT.

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

Так что вам нужно выяснить, что не так с этими конкретными значениями строк.

Смотрите документы

Ответ 2

Ваша проблема здесь в том, что dtype "Date" остался как str/object. Вы можете использовать параметр parse_dates при использовании read_csv

import pandas as pd
file = '/pathtocsv.csv'
df = pd.read_csv(file, sep = ',', parse_dates= [col],encoding='utf-8-sig', usecols= ['Date', 'ids'],)    
df['Month'] = df['Date'].dt.month

Из документации по параметру parse_dates

parse_dates: bool или список int или имен или список списков или dict, по умолчанию False

Поведение выглядит следующим образом:

  • логическое значение. Если True → попробуйте выполнить синтаксический анализ индекса.
  • список int или имен. например Если [1, 2, 3] ->, попробуйте проанализировать столбцы 1, 2, 3, каждый как отдельный столбец даты.
  • список списков. например Если [[1, 3]] → объединить столбцы 1 и 3 и проанализировать как один столбец даты.
  • диктовать, например {‘Foo: [1, 3]} → проанализировать столбцы 1, 3 как дату и результат вызова‘ foo

Если столбец или индекс не могут быть представлены в виде массива даты и времени, скажем, из-за неразборчивого значения или комбинации часовых поясов, столбец или индекс будут возвращены без изменений в качестве типа данных объекта. Для нестандартного анализа даты и времени используйте pd.to_datetime после pd.read_csv. Чтобы проанализировать индекс или столбец со смесью часовых поясов, укажите, что date_parser является частично примененным pandas.to_datetime() с utc=True. Дополнительную информацию смотрите в разделе Анализ CSV со смешанными часовыми поясами.

Note: A fast-path exists for iso8601-formatted dates.

Соответствующим случаем для этого вопроса является "список целых или имен".

col - это индекс столбцов "Date", который анализируется как отдельный столбец даты.