在时间序列中找出最接近指定时间的值
在Python中,我有两组以时间和值成对的测量数据,需要用第二组的数值对第一组中的某个测量进行修正。不过,这两组测量的时间并不完全重合。
具体来说,我有一个列表 x:
[[datetime.datetime(2026, 1, 14, 12, 0, 19), 0.6],
[datetime.datetime(2026, 1, 14, 13, 0, 19), 0.28],
[datetime.datetime(2026, 1, 14, 14, 0, 19), 0.37],
[datetime.datetime(2026, 1, 14, 15, 0, 19), 0.22],
[datetime.datetime(2026, 1, 14, 16, 0, 19), 0.54],
[datetime.datetime(2026, 1, 14, 17, 0, 19), 0.22],
[datetime.datetime(2026, 1, 14, 18, 0, 19), 0.45],
[datetime.datetime(2026, 1, 14, 19, 0, 19), 0.17],
[datetime.datetime(2026, 1, 14, 20, 0, 19), 0.22],
...]
以及一个列表 y:
[[datetime.datetime(2026, 1, 14, 13, 0, 23), 24.49762711864406],
[datetime.datetime(2026, 1, 14, 14, 0, 22), 24.537627118644064],
[datetime.datetime(2026, 1, 14, 15, 0, 22), 24.517627118644064],
[datetime.datetime(2026, 1, 14, 16, 0, 22), 24.507627118644063],
[datetime.datetime(2026, 1, 14, 17, 0, 22), 24.507627118644063],
[datetime.datetime(2026, 1, 14, 18, 0, 22), 24.507627118644063],
[datetime.datetime(2026, 1, 14, 19, 0, 22), 24.507627118644063],
[datetime.datetime(2026, 1, 14, 20, 0, 22), 24.49762711864406],
[datetime.datetime(2026, 1, 14, 21, 0, 22), 24.49762711864406],
...]
从数学上讲,我把这两组数据视作x(t) 和y(t) 两个函数的取值,现在想应用如下的修正:
x(t) := x(t) + f(y(t))
其中f 是一个已知函数。我可以假设,对于每个x(t),在一个“足够接近”的时间点存在一个y(t),可以在该时间点应用这个修正。然而,时间并不完全一致,且其中一个列表中可能存在一些时间点的间隙,因此不能简单地用列表索引来对应。
最有效的方式是什么,以选取正确的y(t)?
解决方案
线性插值:
- 选择
y(t1)和y(t2),使得y(t1) <= x(t) < y(t2) - 找到
s,使得t = t1 + s (t2 - t1) - 对
y(t) := y(t1) + s (y(t2) - y(t1))进行插值
如果你只想在一个点 t 处应用修正,那么为了找到 t1,可以使用Python标准库函数 bisect.bisect:
import bisect
from operator import itemgetter
i = bisect.bisect(y, t, key=itemgetter(0))
t1, y1 = y[i-1] # only works if i > 0, that is, if t >= y[0][0]
t2, y2 = y[i]
s = (t - t1) / (t2 - t1)
yt = y1 + s * (y2 - y1)
如果你想在数组 x 的所有点应用修正,那么你应该写一个带有两个索引的循环:一个索引 i,用于 x,另一个索引 j,用于 y,循环中 i 在每次迭代时增加1,而 j 可以在找到数组 y 中的下一个相关时间点之前增加0 或更多:
j = 0 # index for y
x_new = []
for i, (t, xt) in enumerate(x):
while not y[j][0] <= xt <= y[j+1][0]: # this assumes y[0][0] <= x[0][0] and y[-1][0] >= x[-1][0]
j += 1
t1, y1 = y[j]
t2, y2 = y[j+1]
s = ...
yt = ...
x_new.append((t, xt + f(yt)))
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。