合并具有时间容差的 pandas 时间序列

Posted

技术标签:

【中文标题】合并具有时间容差的 pandas 时间序列【英文标题】:Merge pandas time series with time tolerance 【发布时间】:2019-01-23 23:31:27 【问题描述】:

我有两个数据框要合并。它们的时间戳频率约为 5 分钟,但略有偏差。任一数据框中都有丢失。

我曾尝试合并/加入/对齐两者,但每种方法都有问题。我需要确保数据是正确的(所以宁愿从两个数据帧中删除任何丢失的点)并且我想获得尽可能多的数据(例如,如果它们关闭

使用

df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
df['Time'] = df['Time'].dt.round('1min')

1 分钟和 5 分钟的舍入间隔没有帮助。

pd.mergepd.join 由于未对齐而丢弃了太多数据点。我不确定np.isclose 是否易于调整时间以浮动和返回时间序列。

只是为了说明,下面是数据帧的大致样子(第一行是值,第二行是时间索引):

part of df1

10  2018-08-01 00:59:00
11  2018-08-01 01:04:00
12  2018-08-01 01:09:00
13  2018-08-01 01:14:00
14  2018-08-01 01:19:00
15  2018-08-01 01:24:00
16  2018-08-01 01:29:00
17  2018-08-01 01:34:00
18  2018-08-01 01:39:00
19  2018-08-01 01:44:00
110  2018-08-01 01:49:00
111  2018-08-01 01:54:00
112  2018-08-01 02:04:00

part of df2

20  2018-08-01 01:01:00
21  2018-08-01 01:06:00
22  2018-08-01 01:11:00
23  2018-08-01 01:16:00
24  2018-08-01 01:26:00
25  2018-08-01 01:36:00
26  2018-08-01 01:46:00
27  2018-08-01 01:51:00
28  2018-08-01 01:56:00
29  2018-08-01 02:01:00

预期输出(第一行是时间参考说明):

00  2018-08-01 01:01:00 20 10
05  2018-08-01 01:06:00 21 11
10  2018-08-01 01:11:00 22 12
15  2018-08-01 01:16:00 23 13
20  missing df2 - skip
25  2018-08-01 01:26:00 24 15
30  missing df2 - skip
35  2018-08-01 01:36:00 25 17
40  missing df2 - skip
45  2018-08-01 01:46:00 26 19
50  2018-08-01 01:51:00 27 110
55  2018-08-01 01:56:00 28 111
60  missing in df1 - skip

创建df1和df2的代码:

df1 = pd.DataFrame('val' : ['10 ', '11 ', '12 ', '13 ', '14 ', '15 ', '16 ', '17 ', '18 ', '19 ', '110', '111', '112'], index= ['2018-08-01 00:59:00', '2018-08-01 01:04:00', '2018-08-01 01:09:00', '2018-08-01 01:14:00', '2018-08-01 01:19:00', '2018-08-01 01:24:00', '2018-08-01 01:29:00', '2018-08-01 01:34:00', '2018-08-01 01:39:00', '2018-08-01 01:44:00', '2018-08-01 01:49:00', '2018-08-01 01:54:00', '2018-08-01 02:04:00'])
df2 = pd.DataFrame('val' :['20', '21', '22', '23', '24', '25', '26', '27', '28', '29'], index= ['2018-08-01 01:01:00', '2018-08-01 01:06:00', '2018-08-01 01:11:00', '2018-08-01 01:16:00', '2018-08-01 01:26:00', '2018-08-01 01:36:00', '2018-08-01 01:46:00', '2018-08-01 01:51:00', '2018-08-01 01:56:00', '2018-08-01 02:01:00'])

我尝试了许多不同的方式/方法/选项,但大多数都丢弃了太多数据或将大多数值设置为 NaN。

【问题讨论】:

【参考方案1】:

试试merge_asof

df1.index=pd.to_datetime(df1.index)
df2.index=pd.to_datetime(df2.index)
pd.merge_asof(df2.reset_index(),df1.reset_index(),on='index',direction = 'nearest',tolerance =pd.Timedelta('5 min'))
Out[73]: 
                index val_x val_y
0 2018-08-01 01:01:00    20   10 
1 2018-08-01 01:06:00    21   11 
2 2018-08-01 01:11:00    22   12 
3 2018-08-01 01:16:00    23   13 
4 2018-08-01 01:26:00    24   15 
5 2018-08-01 01:36:00    25   17 
6 2018-08-01 01:46:00    26   19 
7 2018-08-01 01:51:00    27   110
8 2018-08-01 01:56:00    28   111
9 2018-08-01 02:01:00    29   112

【讨论】:

以上是关于合并具有时间容差的 pandas 时间序列的主要内容,如果未能解决你的问题,请参考以下文章

匹配两个具有容差的非常大的向量(快速!但节省工作空间)

具有错误字符容差的最长公共子串

Java geotools检查点是不是包含在具有容差的多边形中

Pandas:合并具有相同列名的 pandas 列

Pandas:合并具有不同索引和缺失值的两个数据框

Pandas:合并具有相似名称的列