【发布时间】:2022-02-26 15:01:44
【问题描述】:
我遇到了关于 Pandas 以及如何在 DataFrame 中填写缺失日期的问题。 给定DataFrame的结构如下:
Amount Code Type Date
0 34.97 J36J 74343 2016-01-01
1 16.32 J36J 74343 2016-04-01
2 10.30 J36J 69927 2015-12-01
3 10.45 J36J 69927 2016-07-01
4 5.63 J36J 69927 2017-03-01
5 15.79 J36J 69927 2018-09-01
6 15.00 J36J 69927 2019-06-01
7 6.44 J36J 69926 2016-03-01
8 6.47 J36J 69926 2017-03-01
9 15.00 J36J 69926 2018-07-01
10 15.00 J36J 69926 2019-06-01
- 金额:嗯,金额
- 代码:Productcode 在整个 DataFrame 中都是相同的
- Type:A Producttype,有很多不同的
- 日期:跨越 2015 年 12 月至 2020 年 9 月。
我的目标是为涵盖此时间跨度的每种类型提供每月条目。 意思是,每个材料应该有 58 个条目。 “人为”创建的每月条目的数量应为 0。 因此,我的预期输出将是(仅针对一种类型,例如)
Amount Code Type Date
0 34.97 J36J 74343 2016-01-01
1 16.32 J36J 74343 2016-02-01
2 0 J36J 74343 2016-03-01
3 0 J36J 74343 2016-04-01
4 0 J36J 74343 2016-05-01
5 0 J36J 74343 2016-06-01
6 0 J36J 74343 2016-07-01
7 0 J36J 74343 2016-08-01
8 0 J36J 74343 2016-09-01
9 0 J36J 74343 2016-10-01
10 0 J36J 74343 2016-11-01
11 0 J36J 74343 2016-12-01
幸运的是,有人已经有同样的问题 (Pandas fill in missing dates in DataFrame with multiple columns)
我根据我的情况调整了非常有用的答案:
df.Date=pd.to_datetime(df.Date)
s=pd.date_range(df.Date.min(),df.Date.max(),freq='MS')
df=df.set_index(['Code','Type','Date']).\
Amount.unstack().reindex(columns=s,fill_value=0).stack().reset_index()
df
这工作得很好,但后来我检查了生成的 DataFrame,似乎有些日期丢失了。
398 74343 J36J 2016-01-01 34.97
399 74343 J36J 2016-02-01 0.00
400 74343 J36J 2016-04-01 16.32
401 74343 J36J 2016-05-01 0.00
402 74343 J36J 2016-06-01 0.00
403 74343 J36J 2016-08-01 0.00
404 74343 J36J 2016-10-01 0.00
405 74343 J36J 2016-11-01 0.00
406 74343 J36J 2016-12-01 0.00
你们中有人知道这可能是什么原因吗? 我假设可能是因为我选择的频率('MS')?但我认为其他任何一个都不合适。 (https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html) 还是我必须手动设置数据范围? 在我最初的 DataFrame 中,显然并非所有日期都可用。
对此问题的任何帮助表示赞赏。
BR
【问题讨论】: