如何对齐两个不等大小的时间序列numpy数组?

Dex*_*ers 12 python time-series alignment closest-points

我有两个包含时间序列(unix时间戳)的numpy数组.
想找到一对时间戳(每个数组1个),它们的差异在一个阈值内.

为了实现这一点,我需要将两个时间序列数据对齐成两个数组,这样每个索引都有最接近的对.(如果数组中的两个时间戳同样接近另一个数组中的另一个时间戳,我不介意选择任何一个,因为对的数量比实际值更重要.)

因此,对齐的数据集将具有两个相同大小的数组,另外一个较小的数组将填充空数据.

我在考虑使用timeseries包和align功能.
但我不确定如何使用对齐我的数据这是一个时间序列.

示例考虑两个时间序列数组:

ts1=np.array([ 1311242821.0, 1311242882.0, 1311244025.0, 1311244145.0, 1311251330.0, 
               1311282555.0, 1311282614.0])
ts2=np.array([ 1311226761.0, 1311227001.0, 1311257033.0, 1311257094.0, 1311281265.0])
Run Code Online (Sandbox Code Playgroud)

输出样本:

现在ts2[2] (1311257033.0),它最接近的一对应该是ts1[4] (1311251330.0)因为差异在于5703.0,threshold它是最小的,并且它是最小的.现在,ts2[2]ts1[4] 已经配对,他们应该被排除在外的其他计算.

应该找到这样的Pairs,因此Output数组可能比实际数组长

abs(ts1 [0] -ts2 [0])= 16060
abs(ts1 [0] -ts2 [1])= 15820 //对
abs(ts1 [0] -ts2 [2])= 14212
abs(ts1 [0 ] -ts2 [3])= 14273
abs(ts1 [0] -ts2 [4])= 38444


abs(ts1 [1] -ts2 [0])= 16121
abs(ts1 [1] -ts2 [1])= 15881
abs(ts1 [1] -ts2 [2])= 14151
abs(ts1 [1] -ts2 [3])= 14212
abs(ts1 [1] -ts2 [4])= 38383


abs(ts1 [2] -ts2 [0])= 17264
abs(ts1 [2] -ts2 [1])= 17024
abs(ts1 [2] -ts2 [2])= 13008
abs(ts1 [2] -ts2 [3])= 13069
abs(ts1 [2] -ts2 [4])= 37240


abs(ts1 [3] -ts2 [0])= 17384
abs(ts1 [3] -ts2 [1])= 17144
abs(ts1 [3] -ts2 [2])= 12888
abs(ts1 [3] -ts2 [3])= 17144
abs(ts1 [3] -ts2 [4])= 37120


abs(ts1 [4] -ts2 [0])= 24569
abs(ts1 [4] -ts2 [1])= 24329
abs(ts1 [4] -ts2 [2])= 5703 //对
abs(ts1 [4 ] -ts2 [3])= 5764
abs(ts1 [4] -ts2 [4])= 29935


abs(ts1 [5] -ts2 [0])= 55794
abs(ts1 [5] -ts2 [1])= 55554
abs(ts1 [5] -ts2 [2])= 25522
abs(ts1 [5] -ts2 [3])= 25461
abs(ts1 [5] -ts2 [4])= 1290 //对


abs(ts1 [6] -ts2 [0])= 55853
abs(ts1 [6] -ts2 [1])= 55613
abs(ts1 [6] -ts2 [2])= 25581
abs(ts1 [6] -ts2 [3])= 25520
abs(ts1 [6] -ts2 [4])= 1349


所以这些对是:( ts1[0],ts2[1]), (ts1[4],ts2[2]), (ts1[5],ts2[4])
其余的元素应该null是它们的对
.最后两个数组的大小为9.

如果这个问题很清楚,请告诉我.

Sch*_*huh 1

我不知道你所说的对齐时间戳是什么意思。但是您可以使用 time 模块将时间戳表示为浮点数或整数。第一步,您可以将任何用户格式转换为由 定义的数组time.struct_time。在第二步中,您可以将其转换为纪元开始的秒数。然后你有整数值来使用时间戳进行计算。

文档time.strptime() 中很好地解释了如何使用转换用户格式:

    >>> import time
    >>> t = time.strptime("30 Nov 00", "%d %b %y")
    >>> t
    time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0,
             tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
    >>> time.mktime(t)
    975538800.0
Run Code Online (Sandbox Code Playgroud)