在numpy/scipy中如何将时间序列重新采样为均匀间隔?

8

我有一个随机变量X,在随机时间T进行采样,类似于这个玩具数据:

import numpy as np
T = np.random.exponential(size=1000).cumsum()
X = np.random.normal(size=1000)

这个时间序列看起来像这样:enter image description here 一个关键点是采样间隔是不均匀的:我指的是np.diff(T)的所有元素都不相等。我需要在指定宽度dt的均匀间隔上重新采样时间序列T,X,即(np.diff(T)==dt).all()应返回True
我可以使用scipy.interpolate.interp1d在均匀间隔上重新采样时间序列,但该方法不允许我指定间隔大小dt
from scipy.interpolate import interp1d
T = np.linspace(T.min(),T.max(),T.size) # same range and size with a uniform interval
F = interp1d(T,X,fill_value='extrapolate') # resample the series on uniform interval
X = F(T) # Now it's resampled.

关键问题在于interp1d只有当T.size==X.size时才能接受数组T

是否有其他方法可以尝试将时间序列T,X重新采样为宽度为dt的均匀间隔?

2个回答

8
dt = ...
from scipy.interpolate import interp1d   
Told = np.arange(T.min(),T.max(),T.size)
F = interp1d(Told,X,fill_value='extrapolate') 
Tnew = np.linspace(T.min(), T.max(), dt)
Xnew = F(Tnew)

2
哦,是的,当然。哈哈谢谢!不过我认为linspace应该改成arange - kevinkayaks
我同意@kevinkayaks的观点。dt是重新采样点之间的时间差,因此np.arange()是正确的函数。 - Tom Johnson
1
请在这个解决方案中加上一些关于这个想法的文字。 - LudvigH

0

这对我非常有用。 但是请注意,该行

F = interp1d(Told,X,fill_value='extrapolate') 

不正确。应该是:

F = interp1d(Told,X,kind='extrapolate')

或者(在我的情况下更有用):

F = interp1d(Told,X,kind='previous')

谢谢!我认为API可能在最近的scipy版本中实际上已经发生了变化。就在昨天,我意识到我的一些其他插值脚本已经停止工作了。 - kevinkayaks

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