将缺失的日期添加到 Pandas 中的时间序列 ID

时间:2021-06-17 17:11:02

标签: python pandas

我有以下数据框:

df = pd.DataFrame([[66991,'2020-06-01',2],
                   [66991,'2020-06-02',1],
                   [66991,'2020-07-03',1],
                   [44551,'2020-10-01',1],
                   [66991,'2020-12-05',7],
                   [44551,'2020-12-05',5],
                   [66991,'2020-12-01',1],
                   [66991,'2021-01-08',3]],columns=['ID','DATE','QTD'])

如何将月份(其中 QTD 为零)添加到每个 ID ? (理想情况下,我希望列 BALANCECC 在添加的行上保留每个 ID 的先前值,但这不是绝对必要的,因为我对QTDVAL 列)。

我想过可能会按月为数据框上的每个 ID 重新采样数据,然后将该数据框合并到上面的那个。这是一个很好的实现吗?有没有更好的方法来达到这个结果?

最终应该是这样的:

df = pd.DataFrame([[66991,'2020-06-01',2],
                   [66991,'2020-06-02',1],
                   [66991,'2020-07-03',1],
                   [66991,'2020-08-01',0],
                   [66991,'2020-09-01',0],
                   [66991,'2020-10-01',0],
                   [44551,'2020-10-01',1],
                   [44551,'2020-11-05',0],
                   [66991,'2020-11-01',0],
                   [66991,'2020-12-05',7],
                   [44551,'2020-12-05',5],
                   [66991,'2020-12-01',1],
                   [66991,'2021-01-08',3]],columns=['ID','DATE','QTD'])

1 个答案:

答案 0 :(得分:0)

您可以使用 pd.date_range 通过 ID 生成日期范围,然后创建一个 pd.MultiIndex 以便您可以执行 reindex

s = pd.MultiIndex.from_tuples([(i, x) for i, j in df.groupby("ID")
                               for x in pd.date_range(min(j["DATE"]), max(j["DATE"]), freq="MS")],
                              names=["ID", "DATE"])

df = df.set_index(["ID", "DATE"])

print (df.reindex(df.index|s, fill_value=0)
         .reset_index()
         .groupby(["ID", pd.Grouper(key="DATE", freq="M")], as_index=False)
         .apply(lambda i: i[i["QTD"].ne(0)|(len(i)==1)])
         .droplevel(0))

       ID       DATE  QTD
0   44551 2020-10-01    1
1   44551 2020-11-01    0
3   44551 2020-12-05    5
4   66991 2020-06-01    2
5   66991 2020-06-02    1
7   66991 2020-07-03    1
8   66991 2020-08-01    0
9   66991 2020-09-01    0
10  66991 2020-10-01    0
11  66991 2020-11-01    0
12  66991 2020-12-01    1
13  66991 2020-12-05    7
15  66991 2021-01-08    3