我有两个时间序列(但是作为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
Pandas加入和合并操作并没有完全实现我想要的。 This post有点接近,但也不是我想要的。这似乎是一个非常基本的“时间加入”,所以我认为应该有一些开箱即用的方法来做到这一点?
排除有关ts1中重复次数的问题:实际上,还有另一列(比如ID列)可以区分这些。所以实际上,可以说ts1有一个MultiIndex。我想让示例尽可能简单,而且ts2 不具有该ID列。我想纯粹基于时间来应用价值。
我正在使用Python 2.7.x和Pandas 0.17.0。如有必要,我可能会升级后者。 提前谢谢!
答案 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'])