我有两个要合并的数据框。他们的时间戳频率为〜5分钟,但略有偏离。任一数据框中都有缺失。
我试图将两者合并/合并/对齐,但是每种方法都存在问题。我需要确保数据正确(因此宁愿从两个数据帧中删除任何丢失的点),我想获取尽可能多的数据(例如,如果关闭时间少于5分钟,我仍然希望合并这些数据值)。
使用
df['Time'] = pd.to_datetime(df['Time'], errors='coerce')
df['Time'] = df['Time'].dt.round('1min')
取整1分钟和5分钟取整间隔无济于事。
pd.merge
和pd.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。
答案 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