Tengo un Dataframe, df, con la siguiente columna:
df['ArrivalDate'] =
...
936 2012-12-31
938 2012-12-29
965 2012-12-31
966 2012-12-31
967 2012-12-31
968 2012-12-31
969 2012-12-31
970 2012-12-29
971 2012-12-31
972 2012-12-29
973 2012-12-29
...
Los elementos de la columna son pandas.tslib.Timestamp.
Solo quiero incluir el año y el mes. Pensé que habría una manera simple de hacerlo, pero no puedo entenderlo.
Esto es lo que he intentado:
df['ArrivalDate'].resample('M', how = 'mean')
Tuve el siguiente error:
Only valid with DatetimeIndex or PeriodIndex
Entonces intenté:
df['ArrivalDate'].apply(lambda(x):x[:-2])
Tuve el siguiente error:
'Timestamp' object has no attribute '__getitem__'
¿Alguna sugerencia?
Editar: lo descubrí.
df.index = df['ArrivalDate']
Entonces, puedo volver a muestrear otra columna usando el índice.
Pero todavía me gustaría un método para reconfigurar toda la columna. ¿Algunas ideas?
to_period
:df.date_column.dt.month
(o.year
, o.day
) funciona.dt.month
aunque pierde el año. Y.dt.to_period('M')
cambia el tipo de datos a algo que ya no es datetime64. Terminé usando la respuesta de Juan sugiriendo.astype('datetime64[M]')
truncar los valores.Respuestas:
Si desea nuevas columnas que muestren año y mes por separado, puede hacer esto:
o...
Luego puede combinarlos o trabajar con ellos tal como son.
fuente
timeit
sugiere que elDatetimeIndex
enfoque es mucho más rápido que cualquiera de los dos.map/.apply
o.dt
.df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
La mejor manera encontrada !!
el
df['date_column']
tiene que estar en formato de fecha y hora.También puede usarlo
D
para Día,2M
durante 2 meses, etc. para diferentes intervalos de muestreo, y en caso de que uno tenga datos de series de tiempo con sello de tiempo, podemos elegir intervalos de muestreo granulares como45Min
45 minutos,15Min
para muestreo de 15 minutos, etc.fuente
datetime64
d. Usandodf.my_date_column.astype('datetime64[M]')
, como en la respuesta de @ Juan, se convierte en fechas que representan el primer día de cada mes.Puedes acceder directamente a
year
month
atributos y , o solicitar undatetime.datetime
:Una forma de combinar año y mes es hacer un número entero que los codifique, como:
201408
para agosto de 2014. A lo largo de una columna completa, puede hacer esto como:o muchas variantes de los mismos.
Sin embargo, no soy un gran fanático de hacer esto, ya que hace que la alineación de la fecha y la aritmética sean dolorosas más tarde y especialmente dolorosas para otros que se encuentran con su código o datos sin esta misma convención. Una mejor manera es elegir una convención del día del mes, como el último día de la semana no festivo en los EE. UU., O el primer día, etc., y dejar los datos en un formato de fecha / hora con la convención de fecha elegida.
El
calendar
módulo es útil para obtener el valor numérico de ciertos días, como el último día de la semana. Entonces podrías hacer algo como:Si está buscando una manera de resolver el problema más simple de simplemente formatear la columna de fecha y hora en alguna representación en cadena, para eso puede usar la
strftime
función de ladatetime.datetime
clase, de esta manera:fuente
pandas
técnicas de división, aplicación y combinación. Mis sugerencias anteriores no deben tomarse como un aval de que son los enfoques más eficaces para su caso, solo que son elecciones Pythonic estilísticamente válidas para una variedad de casos.df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
.Si desea el par único de mes año, el uso de aplicar es bastante elegante.
Salidas mes-año en una columna.
No olvides cambiar primero el formato a fecha-hora antes, generalmente lo olvido.
fuente
df['month_year'] = df['date_column'].dt.strftime('%B-%Y')
Extrayendo el año decir de ['2018-03-04']
El df ['Año'] crea una nueva columna. Mientras que si quieres extraer el mes solo usa .month
fuente
Primero puede convertir sus cadenas de fecha con pandas.to_datetime , que le da acceso a todas las facilidades nudosas de datetime y timedelta . Por ejemplo:
fuente
trunc
. ¿Hay alguna documentación para laastype('datetime64[M]')
convención?Gracias a jaknap32 , quería agregar los resultados según el año y el mes, así que funcionó:
La salida fue ordenada:
fuente
La solución de @KieranPC es el enfoque correcto para Pandas, pero no es fácilmente extensible para atributos arbitrarios. Para esto, puede usar
getattr
dentro de un generador de comprensión y combinar usandopd.concat
:fuente
Esto funcionó bien para mí, no pensé que los pandas interpretarían la fecha de cadena resultante como fecha, pero cuando hice la trama, conocía muy bien mi agenda y la cadena year_month donde se ordenó correctamente ... ¡tengo que amar a los pandas!
fuente
Hay dos pasos para extraer el año para todo el marco de datos sin utilizar el método.
Paso 1
convertir la columna a fecha y hora:
Paso 2
extraer el año o el mes usando el
DatetimeIndex()
métodofuente
LÍNEA ÚNICA: Agregar una columna con pares 'año-mes ' : ('pd.to_datetime' primero cambia el tipo de columna a fecha-hora antes de la operación)
En consecuencia, para una columna adicional de 'año' o 'mes':
fuente