如何创建月份的期间范围并用零填充?

假设我有一个数据框,其中包含每个月发生的某些事件。数据只有几个月和几年的事件以及每个月发生的事件数量。


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

正如您在上面注意到的,2018 年 1 月到 2019 年 12 月之间有一个时间范围,但并非所有月份都有计数值。比如2018年3月(2018-03)就没有数据,中间有很多月份缺失。


我想把这个缺失的月份填入零,所以基本上我想按{'month':'2018-03', count:0}正确的顺序插入。我还想对所有缺失的月份和应该存在的值做同样的事情。


我所做的如下。


我将月份转换为适当的格式。


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

上面的代码工作正常。


然后我尝试以每月频率创建一个日期范围,但这不起作用。


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

错误说ValueError: Cannot convert Period to Timestamp unambiguously. Use to_timestamp


我该怎么办?谢谢。


江户川乱折腾
浏览 118回答 1
1回答

胡子哥哥

使用period_range,然后将句点列转换为PeriodIndex并使用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)         counts2018-01      102018-02       52018-03       02018-04       62018-05       12018-06       22018-07       52018-08       02018-09       02018-10       72018-11       82018-12       02019-01       92019-02       12019-03      102019-04       02019-05      122019-06       02019-07       82019-08       02019-09       02019-10       02019-11      102019-12       4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python