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.