python pandas extrae año de datetime – df = df . año no funciona

Lo siento por esta pregunta que parece repetitiva. Espero que la respuesta me haga sentir como un tonto … pero no he tenido suerte al responder las preguntas similares en SO.

Estoy importando datos a través de read_csv , pero por alguna razón que no puedo entender, no puedo extraer el año o el mes de la serie de datos df['date'] .

 date Count 6/30/2010 525 7/30/2010 136 8/31/2010 125 9/30/2010 84 10/29/2010 4469 df = pd.read_csv('sample_data.csv',parse_dates=True) df['date'] = pd.to_datetime(df['date']) df['year'] = df['date'].year df['month'] = df['date'].month 

Pero esto vuelve:

AttributeError: el objeto ‘Serie’ no tiene atributo ‘año’

Gracias por adelantado.

ACTUALIZAR:

 df = pd.read_csv('sample_data.csv',parse_dates=True) df['date'] = pd.to_datetime(df['date']) df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month 

esto genera el mismo objeto “AttributeError: ‘Series’ no tiene atributo ‘dt'”

SEGUIR:

Estoy usando Spyder 2.3.1 con Python 3.4.1 de 64 bits, pero no puedo actualizar los pandas a una versión más reciente (actualmente en 0.14.1). Cada uno de los siguientes genera un error de syntax no válido:

 conda update pandas conda install pandas==0.15.2 conda install -f pandas 

¿Algunas ideas?

Si está ejecutando una versión reciente de pandas, puede usar el atributo datetime dt para acceder a los componentes de datetime:

 In [6]: df['date'] = pd.to_datetime(df['date']) df['year'], df['month'] = df['date'].dt.year, df['date'].dt.month df Out[6]: date Count year month 0 2010-06-30 525 2010 6 1 2010-07-30 136 2010 7 2 2010-08-31 125 2010 8 3 2010-09-30 84 2010 9 4 2010-10-29 4469 2010 10 

EDITAR

Parece que estás ejecutando una versión anterior de pandas, en cuyo caso funcionaría lo siguiente:

 In [18]: df['date'] = pd.to_datetime(df['date']) df['year'], df['month'] = df['date'].apply(lambda x: x.year), df['date'].apply(lambda x: x.month) df Out[18]: date Count year month 0 2010-06-30 525 2010 6 1 2010-07-30 136 2010 7 2 2010-08-31 125 2010 8 3 2010-09-30 84 2010 9 4 2010-10-29 4469 2010 10 

Respecto a por qué no analizó esto en una fecha y hora en read_csv , debe pasar la posición ordinal de su columna ( [0] ) porque cuando es True intenta analizar las columnas [1,2,3] vea la documentación.

 In [20]: t="""date Count 6/30/2010 525 7/30/2010 136 8/31/2010 125 9/30/2010 84 10/29/2010 4469""" df = pd.read_csv(io.StringIO(t), sep='\s+', parse_dates=[0]) df.info()  Int64Index: 5 entries, 0 to 4 Data columns (total 2 columns): date 5 non-null datetime64[ns] Count 5 non-null int64 dtypes: datetime64[ns](1), int64(1) memory usage: 120.0 bytes 

Entonces, si pasa param parse_dates=[0] a read_csv no debería haber ninguna necesidad de llamar a to_datetime en la columna ‘fecha’ después de la carga.

Esto funciona:

 df['date'].dt.year 

Ahora:

 df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month 

da este dataframe:

  date Count year month 0 2010-06-30 525 2010 6 1 2010-07-30 136 2010 7 2 2010-08-31 125 2010 8 3 2010-09-30 84 2010 9 4 2010-10-29 4469 2010 10 

Lo que funcionó para mí fue actualizar pandas a la última versión:

Desde la línea de comandos:

 conda update pandas 

Cuando usar dt accessor

Una fuente común de confusión gira alrededor de cuándo usar .year y cuándo usar .dt.year .

El primero es un atributo para los objetos pd.DatetimeIndex ; el último para pd.Series objetos. Considere este dataframe:

 df = pd.DataFrame({'Dates': pd.to_datetime(['2018-01-01', '2018-10-20', '2018-12-25'])}, index=pd.to_datetime(['2000-01-01', '2000-01-02', '2000-01-03'])) 

La definición de la serie y el índice parecen similares, pero el constructor pd.DataFrame los convierte a diferentes tipos:

 type(df.index) # pandas.tseries.index.DatetimeIndex type(df['Dates']) # pandas.core.series.Series 

El objeto DatetimeIndex tiene un atributo de year directo, mientras que el objeto Series debe usar el elemento de acceso dt . Del mismo modo para el month :

 df.index.month # array([1, 1, 1]) df['Dates'].dt.month.values # array([ 1, 10, 12], dtype=int64) 

Una diferencia sutil pero importante que vale la pena señalar es que df.index.month da una matriz NumPy, mientras que df['Dates'].dt.month da una serie de Pandas. pd.Series.values , usamos pd.Series.values para extraer la representación de la matriz NumPy.