合并具有时间容差的 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.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。
【问题讨论】:
【参考方案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 时间序列的主要内容,如果未能解决你的问题,请参考以下文章