将大熊猫时间序列与时间公差合并

时间:2018-08-16 23:37:40

标签: python pandas merge time-series alignment

我有两个要合并的数据框。他们的时间戳频率为〜5分钟,但略有偏离。任一数据框中都有缺失。

我试图将两者合并/合并/对齐,但是每种方法都存在问题。我需要确保数据正确(因此宁愿从两个数据帧中删除任何丢失的点),我想获取尽可能多的数据(例如,如果关闭时间少于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 个答案:

答案 0 :(得分:2)

尝试使用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