year to_datetime google convert column python datetime pandas extract dataframe

to_datetime - python pandas extract year from datetime-df[''year'']=df[''date'']. year no funciona



pandas timestamp string to datetime (4)

Cuando usar el dt accessor

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

El primero es un atributo para los objetos pd.DatetimeIndex ; este último para objetos pd.Series . Considere este marco de datos:

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 son 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 dt 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 proporciona una matriz NumPy, mientras que df[''Dates''].dt.month proporciona una serie Pandas. Arriba, usamos pd.Series.values para extraer la representación de la matriz NumPy.

Perdón por esta pregunta que parece repetitiva: espero que la respuesta me haga sentir como un tonto ... pero no he tenido suerte usando respuestas a 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 marcos 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 "AttributeError: el objeto ''Series'' no tiene el atributo ''dt''"

SEGUIR:

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

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

¿Algunas ideas?


Esto funciona:

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

Ahora:

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

da este marco de datos:

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 los pandas a la última versión:

Desde la línea de comando hacer:

conda update pandas


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

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á ejecutando una versión anterior de pandas, en cuyo caso lo siguiente funcionaría:

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

En cuanto 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] ver los docs

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() <class ''pandas.core.frame.DataFrame''> 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 ser necesario llamar a to_datetime en la columna ''fecha'' después de cargar.