2 votes

Comment créer une période de mois et la remplir de zéros ?

Supposons que j'ai un cadre de données contenant certains événements qui se produisent chaque mois. Les données ne contiennent que les mois et les années des événements et le nombre de ces événements qui se produisent chaque mois.

df = pd.DataFrame({'month':['2018-01', '2018-02', '2018-04','2018-05','2018-06', 
                            '2018-07', '2018-10','2018-11', '2019-01', '2019-02',
                            '2019-03', '2019-05','2019-07', '2019-11', '2019-12'],
                  'counts':[10,5,6,1,2,5,7,8,9,1,10,12,8,10,4]})

df
    month  counts
0   2018-01 10
1   2018-02 5
2   2018-04 6
3   2018-05 1
4   2018-06 2
5   2018-07 5
6   2018-10 7
7   2018-11 8
8   2019-01 9
9   2019-02 1
10  2019-03 10
11  2019-05 12
12  2019-07 10
13  2019-11 10
14  2019-12 4

Comme vous le remarquez ci-dessus, il y a une plage de temps entre janvier 2018 et décembre 2019, mais tous les mois ne comportent pas de valeurs de comptage. Par exemple, il n'y a pas de données pour mars 2018 (2018-03), et il y a de nombreux mois manquants entre les deux.

Je veux mettre ces mois manquants et les remplir avec zéro, donc en gros je veux insérer {'month':'2018-03', count:0} dans le bon ordre. Je veux également faire la même chose pour tous les mois et valeurs manquants qui sont censés être là.

Ce que j'ai fait est le suivant.

J'ai converti le mois au format approprié.

df['month'] = pd.to_datetime(df['month']).dt.to_period('M')

Le code ci-dessus a bien fonctionné.

J'ai ensuite essayé de créer une plage de dates en fréquence mensuelle, mais cela ne fonctionne pas.

idx = pd.date_range(min(df['month']), max(df['month']), freq='M)

L'erreur dit ValueError: Cannot convert Period to Timestamp unambiguously. Use to_timestamp

Que dois-je faire ? Merci.

1voto

jezrael Points 290608

Utilisez period_range puis convertir la colonne des périodes en PeriodIndex et utiliser DataFrame.reindex :

df['month'] = pd.to_datetime(df['month']).dt.to_period('M')
idx = pd.period_range(df['month'].min(), df['month'].max(), freq='M')
df = df.set_index('month').reindex(idx, fill_value=0)
print (df)
         counts
2018-01      10
2018-02       5
2018-03       0
2018-04       6
2018-05       1
2018-06       2
2018-07       5
2018-08       0
2018-09       0
2018-10       7
2018-11       8
2018-12       0
2019-01       9
2019-02       1
2019-03      10
2019-04       0
2019-05      12
2019-06       0
2019-07       8
2019-08       0
2019-09       0
2019-10       0
2019-11      10
2019-12       4

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