AttributeError: kan alleen .DT-accessor gebruiken met datetimelike-waarden

Hallo ik gebruik Panda’s om een ​​kolom naar de maand te converteren.
Wanneer ik mijn gegevens lees, zijn ze objecten:

Date           object
dtype: object

Dus ik doe ze eerst tot nu toe en probeer ze vervolgens te maken als maanden:

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

Ook als dat helpt:

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

Dus, de fout die ik krijg is zo:

/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

Bewerkt:

Datumkolommen zijn als volgt:

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 

Heeft u ideeën?
Hartelijk bedankt!


Antwoord 1, autoriteit 100%

Uw probleem hier is dat to_datetimestil faalde, dus het dtype bleef als str/object, als u param errors='coerce'instelt als de conversie mislukt voor een bepaalde tekenreeks, worden die rijen ingesteld op NaT.

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

Dus je moet uitzoeken wat er mis is met die specifieke rijwaarden.

Bekijk de docs


Antwoord 2, autoriteit 8%

Uw probleem hier is dat het dtype van ‘Date’ als str/object is gebleven. U kunt de parameter parse_datesgebruiken wanneer u read_csv

gebruikt

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

Van de documentatie voor de parse_datesparameter

parse_dates: bool of lijst met int of namen of lijst met lijsten of dict, standaard False

Het gedrag is als volgt:

  • booleaans. Indien waar -> probeer de index te ontleden.
  • lijst met int of namen. bijv. Als [1, 2, 3] -> probeer de kolommen 1, 2, 3 elk als een afzonderlijke datumkolom te ontleden.
  • lijst met lijsten. bijv. Als [[1, 3]] -> combineer kolommen 1 en 3 en ontleden als een enkele datumkolom.
  • dictaat, bijv. {‘foo’ : [1, 3]} -> ontleden kolommen 1, 3 als datum en bel resultaat ‘foo’

Als een kolom of index niet kan worden weergegeven als een array van datetimes, bijvoorbeeld vanwege een niet-parseerbare waarde of een combinatie van tijdzones, wordt de kolom of index ongewijzigd geretourneerd als een objectgegevenstype. Gebruik voor niet-standaard datetime-parsing pd.to_datetimena pd.read_csv. Om een index of kolom met een combinatie van tijdzones te ontleden, specificeert u date_parserals een gedeeltelijk toegepaste pandas.to_datetime()met utc=True. Zie Een CSV met gemengde tijdzones ontleden voor meer informatie.

Opmerking: er bestaat een snelpad voor datums in iso8601-indeling.

Het relevante geval voor deze vraag is de “lijst met int of namen”.

col is de kolommenindex van ‘Datum’ die wordt geparseerd als een afzonderlijke datumkolom.


Antwoord 3, autoriteit 6%

Eerst moet u het formaat van de datumkolom definiëren.

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

Voor uw zaak kan het basisformaat worden ingesteld op;

df['Date'] = pd.to_datetime(df.Date, format='%Y-%m-%d')

Daarna kunt u uw gewenste uitvoer als volgt instellen/wijzigen;

df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')

Antwoord 4

Als je schrijft

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
df['Date'] = df['Date'].dt.strftime('%m/%d')

Het kan worden opgelost

Other episodes