merge_asof () с ближайшим совпадением, если нет совпадения с обратным - PullRequest
0 голосов
/ 16 апреля 2020

Есть ли способ с помощью merge_asof сопоставить время в правом df с ближайшим временем в левом df, только когда нет результата с обратным соответствием?

Вот как я его решаю в момент Мне интересно, есть ли более простой способ.

# DUMMY DATA
import pandas as pd
import datetime as dt
import numpy as np

time0 = dt.datetime(2020, 4, 20,13,00)
times = [time0]

for i in range(3): 
    time0 += dt.timedelta(days=1)
    times = times + [time0]

df1 = pd.DataFrame({'value1': [0, 1, 2, 3],'time':times})


#time in df2 is normally before time in df1
times2 = df1.time - dt.timedelta(hours=13)

# except for the first value that was pulled too late
times2.iloc[0] = times[0] + dt.timedelta(hours=1)

df2 = pd.DataFrame({'value2': [0, 1, 2, 3],'time':times2})


# MERGE DATA WITH BACKWARD AND NEAREST MATCH    
df3_backward = pd.merge_asof(df1, df2, on="time", direction="backward")
df3_nearest = pd.merge_asof(df1, df2, on="time", direction="nearest")

df3 = pd.merge(df3_backward,df3_nearest[['time','value2']],on="time")

df3=df3.rename(columns={"value2_x":"value2_backward", "value2_y":"value2_nearest"})

# USE NEAREST IF BACKWARD MATCH DIDN'T GIVE ANY RESULT
df3['value_2']=np.where(pd.isna(df3.value2_backward),df3.value2_nearest,df3.value2_backward)
df3```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...