在pandas系列中插入0以获得时间序列间隙

时间:2015-03-12 13:42:08

标签: pandas

为了正确绘制数据,我需要将缺失值显示为0.我不希望每个缺失日都有0值,因为这会使存储膨胀。对于每个差距的第一天和最后一天,如何为每个type列插入0值?我不需要在整个序列之前和之后插入0。奖励:如果时间序列是每月或每周数据(日期设置为本月的第一天,或每周一),该怎么办?

例如,对于A类型,此时间序列包含1月3日到10日之间的一个间隔。我需要在1月4日和9日插入0值。

df = DataFrame({"date":[datetime(2015,1,1) + timedelta(days=x) for x in range(0, 3)+range(8, 13)+range(2, 9)], "type": ['A']*8+['B']*7, "value": np.random.randint(10, 100, size=15)})

         date type  value
0  2015-01-01    A     97
1  2015-01-02    A     11
2  2015-01-03    A     89  <-- last date before the gap
3  2015-01-09    A     31  <-- first day after the gap
4  2015-01-10    A     64
5  2015-01-11    A     82
6  2015-01-12    A     75
7  2015-01-13    A     24
8  2015-01-03    B     72
9  2015-01-04    B     46
10 2015-01-05    B     26
11 2015-01-06    B     91
12 2015-01-07    B     36
13 2015-01-08    B     53
14 2015-01-09    B     85

期望的结果(行索引会有所不同)

         date type  value
0  2015-01-01    A     97
1  2015-01-02    A     11
2  2015-01-03    A     89
.  2015-01-03    A     0   <-- gap starts - new value
                           <-- do NOT insert any more values for 04--07
.  2015-01-08    A     0   <-- gap ends - new value
3  2015-01-09    A     31
4  2015-01-10    A     64
5  2015-01-11    A     82
6  2015-01-12    A     75
7  2015-01-13    A     24
8  2015-01-03    B     72
9  2015-01-04    B     46
10 2015-01-05    B     26
11 2015-01-06    B     91
12 2015-01-07    B     36
13 2015-01-08    B     53
14 2015-01-09    B     85

1 个答案:

答案 0 :(得分:0)

也许是一个不优雅的解决方案,但似乎最容易分割数据框,填写缺失的日期,并重新组合,如下所示:

# with pandas imported as pd

dfA = df[df.type=='A']
new_axis = pd.date_range(df.date.min(), df.date.max())

dfA.set_index('date', inplace=True)
missing_dates = list(set(new_axis).difference(dfA.index))
dfA.loc[min(missing_dates)] = 'A', 0
dfA.loc[max(missing_dates)] = 'A', 0

df = pd.concat([df[df.type=='B'].set_index('date'), dfA])