Mis datos pueden tener múltiples eventos en una fecha determinada o NO eventos en una fecha. Tomo estos eventos, obtengo un recuento por fecha y los trazo. Sin embargo, cuando los trazo, mis dos series no siempre coinciden.
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
En el código anterior, idx se convierte en un rango de digamos 30 fechas. 01/09/2013 a 30/09/2013 Sin embargo, S solo puede tener 25 o 26 días porque no sucedieron eventos en una fecha determinada. Luego obtengo un AssertionError ya que los tamaños no coinciden cuando intento trazar:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
¿Cuál es la forma correcta de abordar esto? ¿Quiero eliminar fechas sin valores de IDX o (lo que prefiero hacer) es agregar a la serie la fecha que falta con un recuento de 0. Prefiero tener un gráfico completo de 30 días con 0 valores. Si este enfoque es correcto, ¿alguna sugerencia sobre cómo comenzar? ¿Necesito algún tipo de dinámicareindex
función ?
Aquí hay un fragmento de S ( df.groupby(['simpleDate']).size()
), no hay entradas para 04 y 05.
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
reindex
Es una función asombrosa. Puede (1) reordenar los datos existentes para que coincidan con un nuevo conjunto de etiquetas, (2) insertar nuevas filas donde no existía ninguna etiqueta previamente, (3) completar los datos de las etiquetas que faltan, (incluyendo el llenado hacia adelante / hacia atrás) (4) seleccionar filas por etiqueta!idx = pd.date_range(df.index.min(), df.index.max())
Una solución más rápida es usar
.asfreq()
. Esto no requiere la creación de un nuevo índice para llamar dentro.reindex()
.fuente
date_range
ya que utiliza implícitamente el primer y último índice como inicio y fin (que es lo que casi siempre querría).Un problema es que
reindex
fallará si hay valores duplicados. Digamos que estamos trabajando con datos con fecha y hora, que queremos indexar por fecha:rendimientos
Debido a la
2016-11-16
fecha duplicada , un intento de reindexar:falla con:
(con esto significa que el índice tiene duplicados, no es que sea un duplicado)
En cambio, podemos usar
.loc
para buscar entradas para todas las fechas en el rango:rendimientos
fillna
se puede usar en la serie de columnas para llenar espacios en blanco si es necesario.fuente
Blanks
oNULLS
?df.loc[all_days]
no funcionará en ese caso.Un enfoque alternativo es
resample
, que puede manejar fechas duplicadas además de las fechas faltantes. Por ejemplo:resample
es una operación diferida,groupby
por lo que debe seguirla con otra operación. En este casomean
funciona bien, pero también puedes usar muchos otros métodos de pandas comomax
,sum
, etc.Aquí están los datos originales, pero con una entrada adicional para '2013-09-03':
Y aquí están los resultados:
Dejé las fechas faltantes como NaNs para dejar en claro cómo funciona esto, pero puede agregar
fillna(0)
para reemplazar NaNs con ceros según lo solicitado por el OP o alternativamente usar algo comointerpolate()
llenar con valores distintos de cero basados en las filas vecinas.fuente
Aquí hay un buen método para completar las fechas que faltan en un marco de datos, con su elección
fill_value
,days_back
completar y ordenar (date_order
) por el cual ordenar el marco de datos:fuente