Meus dados podem ter vários eventos em uma determinada data ou NENHUM evento em uma data. Pego esses eventos, conto por data e os traço. No entanto, quando os traço, minhas duas séries nem sempre correspondem.
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
No código acima, o idx se torna um intervalo de, digamos, 30 datas. 01-09-2013 a 30-09-2013 No entanto, S pode ter apenas 25 ou 26 dias porque nenhum evento ocorreu em uma determinada data. Em seguida, recebo um AssertionError, pois os tamanhos não correspondem quando tento traçar:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
Qual é a maneira correta de resolver isso? Eu quero remover datas sem valores do IDX ou (o que eu preferiria) é adicionar à série a data que falta com uma contagem de 0. Prefiro ter um gráfico completo de 30 dias com 0 valores. Se essa abordagem for correta, alguma sugestão de como começar? Preciso de algum tipo de reindex
função dinâmica ?
Aqui está um trecho de S ( df.groupby(['simpleDate']).size()
), observe que não há entradas para 04 e 05.
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
reindex
é uma função incrível. Ele pode (1) reordenar os dados existentes para corresponder a um novo conjunto de etiquetas, (2) inserir novas linhas onde nenhuma etiqueta existia anteriormente, (3) preencher dados para etiquetas ausentes (incluindo preenchimento para frente / trás) (4) selecionar linhas por etiqueta!idx = pd.date_range(df.index.min(), df.index.max())
Uma solução mais rápida é usar
.asfreq()
. Isso não requer a criação de um novo índice para chamar dentro.reindex()
.fonte
date_range
pois usa implicitamente o primeiro e o último índice como o início e o fim (que é o que você quase sempre deseja).Uma questão é que
reindex
falhará se houver valores duplicados. Digamos que estamos trabalhando com dados com timestamp, que queremos indexar por data:rendimentos
Devido à
2016-11-16
data duplicada , uma tentativa de reindexar:falha com:
(com isso, significa que o índice tem duplicatas, não que seja um dup)
Em vez disso, podemos usar
.loc
para procurar entradas para todas as datas no intervalo:rendimentos
fillna
pode ser usado na série de colunas para preencher espaços em branco, se necessário.fonte
Blanks
ouNULLS
?df.loc[all_days]
não funcionará nesse caso.Uma abordagem alternativa é
resample
, que pode lidar com datas duplicadas, além de datas ausentes. Por exemplo:resample
é uma operação adiada como essa,groupby
então você precisa segui-la com outra operação. Neste casomean
funciona bem, mas você também pode usar vários métodos de outros pandas comomax
,sum
, etc.Aqui estão os dados originais, mas com uma entrada extra para '2013-09-03':
E aqui estão os resultados:
Deixei as datas ausentes como NaNs para esclarecer como isso funciona, mas você pode adicionar
fillna(0)
para substituir NaNs por zeros, conforme solicitado pelo OP ou, alternativamente, usar algo comointerpolate()
preencher valores diferentes de zero com base nas linhas vizinhas.fonte
Aqui está um bom método para preencher datas ausentes em um quadro de dados, com sua escolha
fill_value
,days_back
preencher e classificar a ordem (date_order
) pela qual classificar o quadro de dados:fonte