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.monthaunque 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
timeitsugiere que elDatetimeIndexenfoque es mucho más rápido que cualquiera de los dos.map/.applyo.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
Dpara Día,2Mdurante 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 como45Min45 minutos,15Minpara muestreo de 15 minutos, etc.fuente
datetime64d. 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
yearmonthatributos y , o solicitar undatetime.datetime:Una forma de combinar año y mes es hacer un número entero que los codifique, como:
201408para 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
calendarmó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
strftimefunción de ladatetime.datetimeclase, de esta manera:fuente
pandasté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
getattrdentro 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