Итак, с вводом вроде:
import pandas as pd
df1 = pd.DataFrame({'Date1':[pd.datetime(2018,02,28, 23,59,00),pd.datetime(2018,03,01, 00,37,00)],
'Number': [20,35]})
df2 = pd.DataFrame({'Date2':[pd.datetime(2018,02,28,23,50,00), pd.datetime(2018,02,28,23,51,00),pd.datetime(2018,03,01,00,42,00)],
'Value':[20, 35, 46]})
Сначала вы можете создать столбец l_d2
в df1 со списком всех Date2
в течение +/- 10 минут от Date1
из df1
, например (вот функция фильтрации, которая вам действительно нужна):
from datetime import timedelta
df1['l_d2'] = df1['Date1'].apply(lambda x: list(df2['Date2'][((x- timedelta(minutes=10)) <= df2['Date2']) & (df2['Date2'] <= (x + timedelta(minutes=10)))]))
Затем вы создаете серию с функцией stack
для этого нового столбца, например:
s1 = df1.apply(lambda x: pd.Series(x['l_d2']),axis=1).stack().reset_index(level=1, drop=True)
s1.name = 'Date2' #same name as in df2 for merging after
И, наконец, вы можете создать желаемый результат df_output
, соединив s1
с df1
, опустив столбец l_d2
(больше не нужен) и объединившись с df2
, чтобы добавить столбец Value
:
df_output = df1.drop('l_d2', axis=1).join(s1).merge(df2, on ='Date2')
Результат с моими данными:
Date1 Number Date2 Value
0 2018-02-28 23:59:00 20 2018-02-28 23:50:00 20
1 2018-02-28 23:59:00 20 2018-02-28 23:51:00 35
2 2018-03-01 00:37:00 35 2018-03-01 00:42:00 46