在Pandas中移动缺失日期的时间序列

5

我有一个时间序列,其中有一些缺失的条目,看起来像这样:

date     value
---------------
2000       5
2001      10
2003      8
2004      72
2005      12
2007      13

我想为“previous_value”创建一列。但我只希望它显示连续年份的值。因此我希望它看起来像这样:

date     value    previous_value
-------------------------------
2000       5        nan
2001      10         5
2003      8         nan
2004      72         8
2005      12        72
2007      13        nan

然而,将pandas shift函数直接应用于'value'列会导致在'time' = 2003时'previous_value' = 10,在'time' = 2007时'previous_value' = 12。

在pandas中,最优雅的方式是如何处理这个问题?(我不确定是否像设置'freq'属性一样容易。)

2个回答

8
In [588]: df = pd.DataFrame({ 'date':[2000,2001,2003,2004,2005,2007],
                              'value':[5,10,8,72,12,13] })

In [589]: df['previous_value'] = df.value.shift()[ df.date == df.date.shift() + 1 ]

In [590]: df
Out[590]: 
   date  value  previous_value
0  2000      5             NaN
1  2001     10               5
2  2003      8             NaN
3  2004     72               8
4  2005     12              72
5  2007     13             NaN

此外,您还可以使用 resample() 进行时间序列处理,详见:如何在不均匀间隔的数据中使用 shift() 函数


谢谢!我在 Stack Overflow 上搜索了其他答案,但不知何故错过了那个。 - user3591836

1

您的示例看起来不像带有时间戳的实时系列数据。让我们以另一个缺失日期2020-01-03的示例为例:

df = pd.DataFrame({"val": [10, 20, 30, 40, 50]},
                  index=pd.date_range("2020-01-01", "2020-01-05"))
df.drop(pd.Timestamp('2020-01-03'), inplace=True)

            val
2020-01-01   10
2020-01-02   20
2020-01-04   40
2020-01-05   50

为了向前或向后移动一天,您可以将freq参数设置为“D”:
df.shift(1, freq='D')

输出:

            val
2020-01-02   10
2020-01-03   20
2020-01-05   40
2020-01-06   50

要将原始数据与移位后的数据合并,您可以合并这两个表:

df.merge(df.shift(1, freq='D'),
         left_index=True,
         right_index=True,
         how='left',
         suffixes=('', '_previous'))

输出:

            val  val_previous
2020-01-01   10           NaN
2020-01-02   20          10.0
2020-01-04   40           NaN
2020-01-05   50          40.0

你可以在这里找到其他偏移别名here


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