我有两个时间序列(但作为DataFrame,即多元序列),ts1
和ts2
。 Ts1
有重复的时间,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'])