[英]Synchronizing and Resampling two timeseries with non-uniform millisecond intraday data
我在 python 文檔中看到重新采樣和同步兩個時間序列的能力。 我的問題更難,因為時間序列中沒有時間規律。 我閱讀了三個具有非確定性日內時間戳的時間序列。 但是,為了對這兩個時間序列進行大多數分析(協方差、相關性等),我需要它們的長度相同。
在 Matlab 中,給定三個具有非確定性日內時間戳的時間序列ts1, ts2, ts3
,我可以通過說來同步它們
[ts1, ts2] = synchronize(ts1, ts2, 'union');
[ts1, ts3] = synchronize(ts1, ts3, 'union');
[ts2, ts3] = synchronize(ts2, ts3, 'union');
請注意,時間序列已被讀入 Pandas DataFrame,因此我需要能夠與已創建的 DataFrame 同步(和重新采樣?)。
根據您鏈接到的 Matlab 文檔,聽起來您想要
使用時間向量對時間序列對象重新采樣,該時間向量是
ts1
和ts2
在兩個時間向量重疊的時間范圍內的時間向量的並集。
所以首先你需要找到你的數據幀索引的聯合:
newindex = df1.index.union(df2.index)
然后你可以使用這個索引重新創建你的數據幀:
df1 = df1.reindex(newindex)
df2 = df2.reindex(newindex)
請注意,它們的所有新條目中都將包含NaN
(大概這與 Matlab 中的行為相同),是否要填充這些取決於您,例如fillna(method='pad')
將填充 null值使用最后一個已知值,或者您可以使用interpolate(method='time')
使用基於時間戳的線性插值。
也可以merge
以synchronize
數據幀。 特別是我們可能希望將 2 個數據幀與 2 個不同的數據字段同步以保留而不是 1 個。例如,假設我們有這 3 個數據幀與溫度和濕度值要同步:
df1
company_id log_date temperature
0 4 2020-02-29 00:00:00 24.0
1 4 2020-02-29 00:03:00 24.0
2 4 2020-02-29 00:06:00 23.9
3 4 2020-02-29 00:09:00 23.8
4 4 2020-02-29 00:12:00 23.8
5 4 2020-02-29 00:15:00 23.7
6 4 2020-02-29 00:18:00 23.6
7 4 2020-02-29 00:21:00 23.5
8 4 2020-02-29 00:24:00 23.4
9 4 2020-02-29 00:27:00 23.3
10 4 2020-02-29 00:30:00 24.0
11 4 2020-02-29 00:33:00 21.0
12 4 2020-02-29 00:36:00 22.9
13 4 2020-02-29 00:39:00 23.8
14 4 2020-02-29 00:42:00 22.8
15 4 2020-02-29 00:45:00 21.7
16 4 2020-02-29 00:48:00 22.6
17 4 2020-02-29 00:51:00 21.5
df2
company_id log_date humidity
0 4 2020-02-29 00:00:00 74.92
1 4 2020-02-29 00:05:00 75.00
2 4 2020-02-29 00:10:00 73.10
3 4 2020-02-29 00:15:00 72.10
4 4 2020-02-29 00:20:00 72.00
5 4 2020-02-29 00:25:00 73.00
6 4 2020-02-29 00:30:00 74.00
7 4 2020-02-29 00:35:00 72.10
8 4 2020-02-29 00:45:00 69.00
9 4 2020-02-29 00:50:00 71.92
df3
company_id log_date temperature
0 4 2020-02-29 00:00:00 20.00
1 4 2020-02-29 00:05:00 21.00
2 4 2020-02-29 00:10:00 22.00
3 4 2020-02-29 00:15:00 23.00
4 4 2020-02-29 00:20:00 23.10
5 4 2020-02-29 00:25:00 22.00
6 4 2020-02-29 00:30:00 22.00
7 4 2020-02-29 00:35:00 22.10
8 4 2020-02-29 00:45:00 23.00
9 4 2020-02-29 00:50:00 21.92
我們可以做這樣的事情
df1['log_date'] = pd.to_datetime(df1['log_date'])
df2['log_date'] = pd.to_datetime(df2['log_date'])
df3['log_date'] = pd.to_datetime(df3['log_date'])
df_a = pd.merge_asof(df1, df2, on="log_date", by="company_id", tolerance=pd.Timedelta("5m"))
df_b = pd.merge_asof(df1, df3, on="log_date", by="company_id", tolerance=pd.Timedelta("5m"))
以及由此產生的數據幀;
df_a
company_id log_date temperature humidity
0 4 2020-02-29 00:00:00 24.0 74.92
1 4 2020-02-29 00:03:00 24.0 74.92
2 4 2020-02-29 00:06:00 23.9 75.00
3 4 2020-02-29 00:09:00 23.8 75.00
4 4 2020-02-29 00:12:00 23.8 73.10
5 4 2020-02-29 00:15:00 23.7 72.10
6 4 2020-02-29 00:18:00 23.6 72.10
7 4 2020-02-29 00:21:00 23.5 72.00
8 4 2020-02-29 00:24:00 23.4 72.00
9 4 2020-02-29 00:27:00 23.3 73.00
10 4 2020-02-29 00:30:00 24.0 74.00
11 4 2020-02-29 00:33:00 21.0 74.00
12 4 2020-02-29 00:36:00 22.9 72.10
13 4 2020-02-29 00:39:00 23.8 72.10
14 4 2020-02-29 00:42:00 22.8 NaN
15 4 2020-02-29 00:45:00 21.7 69.00
16 4 2020-02-29 00:48:00 22.6 69.00
17 4 2020-02-29 00:51:00 21.5 71.92
df_b
company_id log_date temperature_x temperature_y
0 4 2020-02-29 00:00:00 24.0 20.00
1 4 2020-02-29 00:03:00 24.0 20.00
2 4 2020-02-29 00:06:00 23.9 21.00
3 4 2020-02-29 00:09:00 23.8 21.00
4 4 2020-02-29 00:12:00 23.8 22.00
5 4 2020-02-29 00:15:00 23.7 23.00
6 4 2020-02-29 00:18:00 23.6 23.00
7 4 2020-02-29 00:21:00 23.5 23.10
8 4 2020-02-29 00:24:00 23.4 23.10
9 4 2020-02-29 00:27:00 23.3 22.00
10 4 2020-02-29 00:30:00 24.0 22.00
11 4 2020-02-29 00:33:00 21.0 22.00
12 4 2020-02-29 00:36:00 22.9 22.10
13 4 2020-02-29 00:39:00 23.8 22.10
14 4 2020-02-29 00:42:00 22.8 NaN
15 4 2020-02-29 00:45:00 21.7 23.00
16 4 2020-02-29 00:48:00 22.6 23.00
17 4 2020-02-29 00:51:00 21.5 21.92
第一個我們有 2 個不同的數據字段temperature
和humidity
,第二個我們有 2 個不同版本的temperature
。 這可能是您正在努力實現的目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.