我有两个时间序列(但作为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


熊猫的合并和合并操作无法完全实现我想要的功能。 This post有点接近,但也不是我想要的。看来这是一个非常基本的“时间加入”,所以我认为应该有一些现成的方法来做到这一点?

为了排除有关ts1中重复时间的问题:实际上,还有另一列(例如ID列)将它们区分开。因此,实际上,ts1可以说具有MultiIndex。我想使示例尽可能简单,而且ts2没有该ID列。我想纯粹基于时间来应用值。

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

最佳答案

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个datetime系列上使用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'])

10-06 13:58