這是一個非常有趣的問題。最初,我打算建議一個類似於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的回答獲得時移的互相關方法。
在這種方法中有很多未解答的問題需要對數據進行檢查和實驗以更具體地確定,比如什麼是識別日出/日落的最佳方法,高斯窗應該有多寬,等等。但是我就是這樣開始攻擊這個問題的。 祝你好運!
(+1)尼斯問題。出於興趣,你爲什麼禁止使用插值? – NPE
我只是想,如果你想估計轉換到高精度,那麼你需要內插到一個非常高的分辨率。由於我有很多數據,我想避免這種情況。 – omar
在我看來,如果您的數據大致是週期性的,那麼fourier系列可能會有所幫助...... – mgilson