这是一个非常有趣的问题。最初,我打算建议一个类似于 user948652 的基于互相关的解决方案。但是,根据您的问题描述,该解决方案存在两个问题:
- 数据的分辨率大于时移,且
- 在某些日子里,预测值和测量值之间的相关性非常低
由于这两个问题,我认为直接应用互相关解决方案实际上可能会增加您的时间偏移,尤其是在预测值和测量值彼此相关性非常低的日子。
在我上面的评论中,我问你是否有任何事件发生在两个时间序列中,你说你没有。但是,根据您的域,我认为您实际上有两个:
- 日出
- 日落
即使信号的其余部分相关性很差,日出和日落也应该有一定的相关性,因为它们会从夜间基线单调增加/减少。因此,这里有一个基于这两个事件的潜在解决方案,它既应该最小化所需的插值,又不依赖于相关性差的信号的互相关。
1.查找大致的日出/日落
这应该很容易,只需获取高于夜间时间平线的第一个和最后一个数据点,并将它们标记为大致的日出和日落。然后,我会关注这些数据,以及两边的点,即:
width=1
sunrise_index = get_sunrise()
sunset_index = get_sunset()
# set the data to zero, except for the sunrise/sunset events.
bitmap = zeros(data.shape)
bitmap[sunrise_index - width : sunrise_index + width] = 1
bitmap[sunset_index - width : sunset_index + width] = 1
sunrise_sunset = data * bitmap
有几种方法可以实现get_sunrise() 和get_sunset(),具体取决于您在分析中需要的严格程度。我会使用numpy.diff,将其设为特定值,然后取高于该值的第一个和最后一个点。您还可以从大量文件中读取夜间数据,计算平均值和标准偏差,并查找超过夜间数据的第一个和最后一个数据点,例如,0.5 * st_dev。您还可以进行某种基于集群的模板匹配,特别是如果不同类别的一天(即晴天、部分阴天和非常多云)具有高度刻板的日出/日落事件。
2。重采样数据
我认为没有任何插值可以解决这个问题。我会使用比移位更高的采样率重新采样数据。如果班次以分钟为单位,则上采样到 1 分钟或 30 秒。
num_samples = new_sample_rate * sunrise_sunset.shape[0]
sunrise_sunset = scipy.signal.resample(sunrise_sunset, num_samples)
或者,我们可以使用三次样条来插入数据(请参阅here)。
3.高斯卷积
由于有一些插值,所以我们不知道实际日出和日落的预测有多精确。所以,我们可以用高斯对信号进行卷积,来表示这种不确定性。
gaussian_window = scipy.signal.gaussian(M, std)
sunrise_sunset_g = scipy.signal.convolve(sunrise_sunset, gaussian_window)
4.互相关
使用user948652的答案中的互相关方法获得时间偏移。
此方法中存在许多未解决的问题,需要对数据进行检查和实验才能更具体地确定,例如识别日出/日落的最佳方法是什么、高斯窗口应该有多宽等.但这是我将如何开始攻击的问题。
祝你好运!