我在python中看到了重采样和同步两个timeseries的能力。我的问题更难,因为时间序列中没有时间规律。我读了三个时刻表,它们都有不确定的日内时间戳。但是,为了对这两个时间序列进行大多数分析(协方差、相关性等),我需要它们具有相同的长度。
在Matlab中,给出了具有非确定性的日内时间戳的三个时间序列ts1, ts2, ts3
,我可以这样说来表示同步性。
[ts1, ts2] = synchronize(ts1, ts2, 'union');
[ts1, ts3] = synchronize(ts1, ts3, 'union');
[ts2, ts3] = synchronize(ts2, ts3, 'union');
请注意,时间序列已经读取到熊猫DataFrame,所以我需要能够同步(和重采样?)已经创建的DataFrames。
发布于 2015-11-23 22:15:11
根据您链接到的Matlab文档,听起来您想要
使用时间向量重采样timeseries对象,该时间向量是
ts1
和ts2
的时间向量在两个时间向量重叠的时间范围内的合并。
因此,首先您需要找到数据的索引的联合:
newindex = df1.index.union(df2.index)
然后可以使用以下索引重新创建数据文件:
df1 = df1.reindex(newindex)
df2 = df2.reindex(newindex)
请注意,它们的所有新条目都将包含NaN
s (想必这与Matlab中的行为相同),如果您想要填充这些条目,则由您决定,例如,fillna(method='pad')
将使用最后一个已知值填充空值,或者您可以使用interpolate(method='time')
根据时间戳使用线性插值。
发布于 2021-06-02 22:54:46
为了实现merge
数据格式,还可以使用synchronize
。特别是,我们可能希望用两个不同的数据字段来同步两个数据文件,而不是一个。例如,假设我们有这三个温湿度值要同步的数据:
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
在第一个版本中,我们有两个不同的数据字段temperature
& humidity
,在第二个字段中,我们有两个不同版本的temperature
。这可能是你正在努力实现的目标。
https://stackoverflow.com/questions/33881035
复制相似问题