насколько я понимаю ваше требование, я думаю, что вы можете сделать это в два этапа.
1.first - объединить два кадра данных по id
merged_data_frame = pd.merge(df1,df2,how="inner",on=["id"],indicator=True)
2. второй шаг
- преобразование даты и типа begin_date, типов end_date в datetime
фильтрация данных по вашему состоянию даты
merged_data_frame["date"] = pd.to_datetime(merged_data_frame["date"])
merged_data_frame["begin_date"] = pd.to_datetime(merged_data_frame["begin_date"])
merged_data_frame["end_date"] = pd.to_datetime(merged_data_frame["end_date"])
merged_data_frame = merged_data_frame[merged_data_frame.begin_date <= merged_data_frame.date]
merged_data_frame = merged_data_frame[merged_data_frame.date > merged_data_frame.end_date]
out=merged_data_frame.drop_duplicates(subset=["id"], keep='last')