python pandas merge по двум столбцам - по символу и ближайшей меньшей дате

Есть два дата фрейма:

a = pd.DataFrame({'symbol': ['A', 'A', 'B', 'B'], 'date': [datetime.date(2022,1,1), datetime.date(2021,1,1),datetime.date(2022,10,1),datetime.date(2021,10,1),]})
b = pd.DataFrame({'symbol': ['A', 'A', 'B', 'B'], 'date': [datetime.date(2021,10,1), datetime.date(2020,1,1),datetime.date(2021,12,1),datetime.date(2020,12,1),], 'value':[9,10,11,12]})

Нужно их смержить так, чтобы получить value по symbol и ближайшей дате меньшей указанной. reindex смотрит по дате и разницу берет abs, а надо чтобы была partition по symbol. Получится должно такое:

c=pd.DataFrame({'symbol': ['A', 'A', 'B', 'B'], 'date': [datetime.date(2022,1,1), datetime.date(2021,1,1),datetime.date(2022,10,1),datetime.date(2021,10,1),], 'value':[9,10,11,12]})

т.е. для A datetime.date(2022,1,1), берется value из b по A и дате datetime.date(2021,10,1), а для A datetime.date(2021,1,1) берется value из b по A и дате datetime.date(2020,1,1), хоть 2021-10-1 ближе, но дата нужна <. Подскажите, пожалуйста, как это сделать?


Ответы (1 шт):

Автор решения: SergFSM

есть такой вариант, но я не уверен на 100%, попробуйте протестировать:

a = pd.DataFrame({'symbol': ['A', 'A', 'B', 'B'], 
                  'date': [pd.Timestamp(2022,1,1), 
                           pd.Timestamp(2021,1,1),
                           pd.Timestamp(2022,10,1),
                           pd.Timestamp(2021,10,1),]})
b = pd.DataFrame({'symbol': ['A', 'A', 'B', 'B'], 
                  'date': [pd.Timestamp(2021,10,1), 
                           pd.Timestamp(2020,1,1),
                           pd.Timestamp(2021,12,1),
                           pd.Timestamp(2020,12,1),], 
                  'value':[9,10,11,12]})

res = (pd.merge_asof(a.sort_values('date'),b.sort_values('date'),on='date',by='symbol').
       sort_values('symbol'))

print(res)
'''
  symbol       date  value
0      A 2021-01-01     10
2      A 2022-01-01      9
1      B 2021-10-01     12
3      B 2022-10-01     11
→ Ссылка