熊猫:将一个时间序列中的值应用于另一个时间序列的前一个实例

时间:2016-03-22 12:58:36

标签: python python-2.7 pandas time-series

我有两个时间序列(但是作为DataFrame,即多变量系列),ts1ts2Ts1有重复的时间,ts2没有。对于ts2[i]中的给定值ts2,我想将该值应用于ts1之前的ts2[i]中的实例,但是ts2[i-1]之后的实例。

这是一个例子(为了简单起见,单变量):

ts1:
    t           v
0   2016-03-01  0.676188
1   2016-03-01  0.228074
2   2016-03-04  0.371788
3   2016-03-05  0.802350
4   2016-03-06  0.090599

ts2:
    t           v
0   2016-03-02  1
1   2016-03-05  2
2   2016-03-08  3

我正在寻找这个结果:

    t           v
0   2016-03-01  1
1   2016-03-01  1
2   2016-03-04  2
3   2016-03-05  2
4   2016-03-06  3

Pandas加入和合并操作并没有完全实现我想要的。 This post有点接近,但也不是我想要的。这似乎是一个非常基本的“时间加入”,所以我认为应该有一些开箱即用的方法来做到这一点?

排除有关ts1中重复次数的问题:实际上,还有另一列(比如ID列)可以区分这些。所以实际上,可以说ts1有一个MultiIndex。我想让示例尽可能简单,而且ts2 具有该ID列。我想纯粹基于时间来应用价值。

我正在使用Python 2.7.x和Pandas 0.17.0。如有必要,我可能会升级后者。 提前谢谢!

1 个答案:

答案 0 :(得分:2)

IIUC然后这应该工作:

In [49]:
ts1['v'] = ts2.loc[np.searchsorted(ts2['t'], ts1['t']),'v'].values
ts1

Out[49]:
           t  v
0 2016-03-01  1
1 2016-03-01  1
2 2016-03-04  2
3 2016-03-05  2
4 2016-03-06  3

所以这会在你的2个日期时间系列中使用np.searchsorted来返回应该插入ts1 [' t']值的索引,这些索引位置就是索引位置,然后我们用它来索引ts2并返回' v'列值,我们必须在这里使用.values因为你在返回的值中有重复的索引所以我们只想要没有索引的值:

In [51]:
ts2.loc[np.searchsorted(ts2['t'], ts1['t']),'v']

Out[51]:
0    1
0    1
1    2
1    2
2    3
Name: v, dtype: int64

您可以看到np.searchsorted的输出返回所需的索引值:

In [50]:
np.searchsorted(ts2['t'], ts1['t'])

Out[50]:
array([0, 0, 1, 1, 2], dtype=int64)

这假定值已排序且已datetime dtype,如果不是,您可以执行ts1['t'] = pd.to_datetime(ts1['t'])