234 votes

Ajouter les dates manquantes aux dataframes pandas

Mes données peuvent comporter plusieurs événements à une date donnée ou AUCUN événement à une date donnée. Je prends ces événements, j'obtiens un décompte par date et je les trace. Cependant, lorsque je les trace, mes deux séries ne correspondent pas toujours.

idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()

Dans le code ci-dessus idx devient une fourchette de 30 dates par exemple. 09-01-2013 à 09-30-2013 Cependant S peut n'avoir que 25 ou 26 jours parce qu'aucun événement ne s'est produit à une date donnée. J'obtiens alors une erreur d'assertion (AssertionError) car les tailles ne correspondent pas lorsque j'essaie de tracer :

fig, ax = plt.subplots()    
ax.bar(idx.to_pydatetime(), s, color='green')

Quelle est la bonne façon d'aborder ce problème ? Est-ce que je veux supprimer les dates sans valeurs de IDX ou (ce que je préférerais) ajouter à la série la date manquante avec un compte de 0. Je préférerais avoir un graphique complet de 30 jours avec 0 valeurs. Si cette approche est la bonne, avez-vous des suggestions sur la façon de commencer ? Ai-je besoin d'une sorte de reindex fonction ?

Voici un extrait de S ( df.groupby(['simpleDate']).size() ), vous remarquerez qu'il n'y a pas d'entrées pour 04 et 05.

09-02-2013     2
09-03-2013    10
09-06-2013     5
09-07-2013     1

2voto

Hakuna-Patata Points 21

Vous pouvez toujours utiliser DataFrame.merge() utilise une jointure gauche entre un DataFrame 'All Dates' et le DataFrame 'Missing Dates'. Exemple ci-dessous.

# example DataFrame with missing dates between min(date) and max(date)
missing_df = pd.DataFrame({
    'date':pd.to_datetime([
        '2022-02-10'
        ,'2022-02-11'
        ,'2022-02-14'
        ,'2022-02-14'
        ,'2022-02-24'
        ,'2022-02-16'
    ])
    ,'value':[10,20,5,10,15,30]
})

# first create a DataFrame with all dates between specified start<-->end using pd.date_range()
all_dates = pd.DataFrame(pd.date_range(missing_df['date'].min(), missing_df['date'].max()), columns=['date'])

# from the all_dates DataFrame, left join onto the DataFrame with missing dates
new_df = all_dates.merge(right=missing_df, how='left', on='date')

1voto

thistleknot Points 427
s.asfreq('D').interpolate().asfreq('Q')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X