从单独数据框中最接近的时间戳中提取信息 pandas
Extract information from closest timestamp in separate dataframe pandas
我有两个数据帧,一个是来自固定位置浮标的连续数据(每 15 秒获取一次),另一个是在不同地点以许多不同时间间隔获取的观测数据。两者在各自的数据帧中都有一致的时间戳。对于每个观察,我需要获取观察的时间戳并在连续数据帧中找到最接近的时间戳,从该行中提取信息,并将其添加到观察中。我很难找到一种方法来使用我的系列在连续数据中找到最接近的时间戳。
观测数据:
counter depth latdeg latmin latdec londeg lonmin ts
0 100001 21.110 72 18.5412 72.309020 -148 -47.071 2018-03-20 17:21:49+01:00
1 100002 22.140 72 18.5448 72.309080 -148 -47.0785 2018-03-20 17:22:07+01:00
2 100003 45.300 72 18.5396 72.308993 -148 -47.0936 2018-03-20 17:34:38+01:00
3 100004 45.310 72 18.5360 72.308933 -148 -47.0974 2018-03-20 17:36:31+01:00
连续数据:
sec sat lat long alt time
4164 62460 9 72.31061472 -148.790606 -6.9809 2018-03-20 17:21:00+01:00
4165 62475 9 72.31061655 -148.7906147 -7.0923 2018-03-20 17:21:15+01:00
4166 62490 9 72.31061099 -148.7906154 -7.7008 2018-03-20 17:21:30+01:00
4167 62505 9 72.31060295 -148.7906237 -8.3746 2018-03-20 17:21:45+01:00
4168 62520 9 72.31059877 -148.7906251 -7.5989 2018-03-20 17:22:00+01:00
例如,我想使用 obs[0]['ts']
并在 cont['time']
中找到最接近时间的索引,即 4167
,然后附加经纬度和经纬度到观察数据框。
您正在寻找pandas.merge_asof
它允许您在不精确的键上连接两个 DataFrame。在这种情况下,您想将它与 direciton = nearest
一起使用,以根据两个最接近的时间戳进行匹配。
import pandas as pd
pd.merge_asof(df_obs, df_cont[['lat', 'long', 'alt', 'time']],
left_on='ts', right_on='time', direction='nearest')
输出:
counter depth latdeg latmin latdec londeg lonmin ts lat long alt time
0 100001 21.11 72 18.5412 72.309020 -148 -47.0710 2018-03-20 16:21:49 72.310603 -148.790624 -8.3746 2018-03-20 16:21:45
1 100002 22.14 72 18.5448 72.309080 -148 -47.0785 2018-03-20 16:22:07 72.310599 -148.790625 -7.5989 2018-03-20 16:22:00
2 100003 45.30 72 18.5396 72.308993 -148 -47.0936 2018-03-20 16:34:38 72.310599 -148.790625 -7.5989 2018-03-20 16:22:00
3 100004 45.31 72 18.5360 72.308933 -148 -47.0974 2018-03-20 16:36:31 72.310599 -148.790625 -7.5989 2018-03-20 16:22:00
如果您不想要,可以删除 time
列,我只是将其保留以明确合并的工作原理。
我有两个数据帧,一个是来自固定位置浮标的连续数据(每 15 秒获取一次),另一个是在不同地点以许多不同时间间隔获取的观测数据。两者在各自的数据帧中都有一致的时间戳。对于每个观察,我需要获取观察的时间戳并在连续数据帧中找到最接近的时间戳,从该行中提取信息,并将其添加到观察中。我很难找到一种方法来使用我的系列在连续数据中找到最接近的时间戳。
观测数据:
counter depth latdeg latmin latdec londeg lonmin ts
0 100001 21.110 72 18.5412 72.309020 -148 -47.071 2018-03-20 17:21:49+01:00
1 100002 22.140 72 18.5448 72.309080 -148 -47.0785 2018-03-20 17:22:07+01:00
2 100003 45.300 72 18.5396 72.308993 -148 -47.0936 2018-03-20 17:34:38+01:00
3 100004 45.310 72 18.5360 72.308933 -148 -47.0974 2018-03-20 17:36:31+01:00
连续数据:
sec sat lat long alt time
4164 62460 9 72.31061472 -148.790606 -6.9809 2018-03-20 17:21:00+01:00
4165 62475 9 72.31061655 -148.7906147 -7.0923 2018-03-20 17:21:15+01:00
4166 62490 9 72.31061099 -148.7906154 -7.7008 2018-03-20 17:21:30+01:00
4167 62505 9 72.31060295 -148.7906237 -8.3746 2018-03-20 17:21:45+01:00
4168 62520 9 72.31059877 -148.7906251 -7.5989 2018-03-20 17:22:00+01:00
例如,我想使用 obs[0]['ts']
并在 cont['time']
中找到最接近时间的索引,即 4167
,然后附加经纬度和经纬度到观察数据框。
您正在寻找pandas.merge_asof
它允许您在不精确的键上连接两个 DataFrame。在这种情况下,您想将它与 direciton = nearest
一起使用,以根据两个最接近的时间戳进行匹配。
import pandas as pd
pd.merge_asof(df_obs, df_cont[['lat', 'long', 'alt', 'time']],
left_on='ts', right_on='time', direction='nearest')
输出:
counter depth latdeg latmin latdec londeg lonmin ts lat long alt time
0 100001 21.11 72 18.5412 72.309020 -148 -47.0710 2018-03-20 16:21:49 72.310603 -148.790624 -8.3746 2018-03-20 16:21:45
1 100002 22.14 72 18.5448 72.309080 -148 -47.0785 2018-03-20 16:22:07 72.310599 -148.790625 -7.5989 2018-03-20 16:22:00
2 100003 45.30 72 18.5396 72.308993 -148 -47.0936 2018-03-20 16:34:38 72.310599 -148.790625 -7.5989 2018-03-20 16:22:00
3 100004 45.31 72 18.5360 72.308933 -148 -47.0974 2018-03-20 16:36:31 72.310599 -148.790625 -7.5989 2018-03-20 16:22:00
如果您不想要,可以删除 time
列,我只是将其保留以明确合并的工作原理。