Я обнаружил, что занимаюсь форматированием, чтобы добраться туда, где вы хотите, чтобы ваш формат был, но:
Запрос DF 1 (df1):
df1.head()
data_interestDate
0 2020-07-15T00:00:00
1 2020-06-11T00:00:00
2 2020-05-14T00:00:00
3 2020-04-14T00:00:00
Запрос DF 2 (df2 ):
df2.head()
data_date value
0 2020-07-21T00:00:00 47.0
1 2020-07-20T00:00:00 46.0
2 2020-07-17T00:00:00 50.0
3 2020-07-16T00:00:00 46.0
4 2020-07-15T00:00:00 48.0
Определите значение сдвига:
shift_val = -5
Установите литеральный столбец (поскольку он был у желаемого вывода):
df2['shift'] = shift_val
Создайте df2 со столбцом 'diff', дающим абсолютную разницу значений value и value.shift (shift_value):
df2.loc[(df2['data_date'].isin(df1['data_interestDate'])), 'diff'] = abs(pd.to_numeric(df2['value'])-pd.to_numeric(df2['value'].shift(shift_val)))
Кажется, ваш вопрос говорит, что вы хотите вернуть df2, но ваши примеры показывают возврат df1 . Вот и то, и другое:
Возвращение df1 (как df3):
df3 = df1.merge(df2, left_on='data_interestDate', right_on='data_date', how='left').drop(['data_date','value'], axis=1)
df3['shift'] = shift_val
Здесь мы теряем значение сдвига при соединении, поэтому оно добавляется обратно (об этом не знаю). Выходы:
df3.head()
data_interestDate shift diff
0 2020-07-15T00:00:00 -5 3.0
1 2020-06-11T00:00:00 -5 NaN
2 2020-05-14T00:00:00 -5 NaN
3 2020-04-14T00:00:00 -5 NaN
Возвращение df2 (как df3):
df3 = df2[df2['data_date'].isin(df1['data_interestDate'])].drop(['value'],axis=1)
Выходы:
df3.head()
data_date shift diff
4 2020-07-15T00:00:00 -5 3.0