これは非常に興味深い問題です。当初、user948652 のものと同様の相互相関ベースのソリューションを提案するつもりでした。ただし、問題の説明から、その解決策には 2 つの問題があります。
- データの解像度がタイム シフトよりも大きく、かつ
- 予測値と実測値の相関が非常に低い日があります
これら 2 つの問題の結果として、相互相関ソリューションを直接適用すると、特に予測値と測定値の相関が非常に低い日には、実際にタイム シフトが増加する可能性が高いと思います。
上記の私のコメントで、両方の時系列で発生するイベントがあるかどうかを尋ねましたが、あなたはないと答えました. ただし、ドメインに基づいて、実際には次の 2 つがあると思います。
- 日の出
- 日没
信号の残りの部分があまり相関していなくても、日の出と日の入りは夜間のベースラインから単調に増加/減少するため、ある程度相関しているはずです。したがって、必要な補間を最小限に抑え、相関の低い信号の相互相関に依存しない、これら 2 つのイベントに基づく潜在的な解決策を次に示します。
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)
または、3 次スプラインを使用してデータを補間することもできます (こちらを参照)。
3. ガウス畳み込み
補間があるため、実際の日の出と日の入りがどの程度正確に予測されたかはわかりません。したがって、信号をガウスで畳み込み、この不確実性を表すことができます。
gaussian_window = scipy.signal.gaussian(M, std)
sunrise_sunset_g = scipy.signal.convolve(sunrise_sunset, gaussian_window)
4.相互相関
user948652 の回答の相互相関法を使用して、タイム シフトを取得します。
この方法には、日の出/日の入りを特定するための最良の方法は何か、ガウスウィンドウの幅など、より具体的に特定するためにデータの調査と実験が必要な多くの未解決の質問があります。しかし、それはどのように問題に取り組み始めるか。幸運を!