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

标签 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 是否易于调整时间 float 并返回时间序列。

仅供说明,以下是数据帧的大致样子(第一行是值,第二行是时间索引):

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。

最佳答案

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

关于python - 合并具有时间容差的 pandas 时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51886643/

相关文章:

python - Django : SyntaxError 'unexpected EOF' while saving a Form

Python:单元测试可以显示预期值和实际值吗?

python - 单级到多级数据框

python - 如何在 Pandas 上对多索引时间序列数据帧进行切片?

git - 有没有办法 merge 两个分支而不丢失文件和更改?

python - 如何使 apidocs 在 sphinx-apidoc 中使用包而不是模块

python - 如何检查 python 脚本中的命令是否卡住并采取替代操作?

python - 错误: 'NoneType' object is not iterable when read_sql

merge - Apache NiFi 是否支持版本控制

安卓错误 : Unable to merge dex