在pandas DataFrame中填充缺失的日期

5
我有很多包含两列的DataFrame,像这样:
Fecha unidades
0 2020-01-01 2.0
84048 2020-09-01 4.0
149445 2020-10-01 11.0
532541 2020-11-01 4.0
660659 2020-12-01 2.0
1515682 2021-03-01 9.0
1563644 2021-04-01 2.0
1759823 2021-05-01 1.0
2226586 2021-07-01 1.0
可以看到,有一些月份是缺失的。缺失的数据取决于DataFrame,可能有2个月、10个月、100%完整或只有一个月。我需要用缺失的月份(从2020-01-01到2021-12-01)填充“Fecha”列,并在添加日期到“Fecha”列时,将“unidades”列的值添加为“0”。
每个“Fecha”列中的元素都是类'pandas._libs.tslibs.timestamps.Timestamp'。如何为每个DataFrame填充缺失的日期?
2个回答

8

您可以创建一个日期范围并使用 "Fecha" 列进行 set_index + reindex 来添加缺失的月份。然后,fillna + reset_index 可以获取所需的结果:

df['Fecha'] = pd.to_datetime(df['Fecha'])
df = (df.set_index('Fecha')
      .reindex(pd.date_range('2020-01-01', '2021-12-01', freq='MS'))
      .rename_axis(['Fecha'])
      .fillna(0)
      .reset_index())

输出:

        Fecha  unidades
0  2020-01-01       2.0
1  2020-02-01       0.0
2  2020-03-01       0.0
3  2020-04-01       0.0
4  2020-05-01       0.0
5  2020-06-01       0.0
6  2020-07-01       0.0
7  2020-08-01       0.0
8  2020-09-01       4.0
9  2020-10-01      11.0
10 2020-11-01       4.0
11 2020-12-01       2.0
12 2021-01-01       0.0
13 2021-02-01       0.0
14 2021-03-01       9.0
15 2021-04-01       2.0
16 2021-05-01       1.0
17 2021-06-01       0.0
18 2021-07-01       1.0
19 2021-08-01       0.0
20 2021-09-01       0.0
21 2021-10-01       0.0
22 2021-11-01       0.0
23 2021-12-01       0.0

0
一种选择是使用pyjanitor的 complete函数:
# pip install pyjanitor
import janitor
import pandas as pd

df = pd.read_clipboard()
df['Fecha'] = pd.to_datetime(df['Fecha'])
# create new variable containing all possible dates
fecha={"Fecha":pd.date_range('2020-01-01', '2021-12-01', freq='MS')}
df.complete(fecha, fill_value=0) 
        Fecha  unidades
0  2020-01-01         2
1  2020-02-01         0
2  2020-03-01         0
3  2020-04-01         0
4  2020-05-01         0
5  2020-06-01         0
6  2020-07-01         0
7  2020-08-01         0
8  2020-09-01         4
9  2020-10-01        11
10 2020-11-01         4
11 2020-12-01         2
12 2021-01-01         0
13 2021-02-01         0
14 2021-03-01         9
15 2021-04-01         2
16 2021-05-01         1
17 2021-06-01         0
18 2021-07-01         1
19 2021-08-01         0
20 2021-09-01         0
21 2021-10-01         0
22 2021-11-01         0
23 2021-12-01         0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接