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