Fusionar dos marcos de datos basados ​​en una fecha entre otras dos fechas sin una columna común

Tengo dos marcos de datos que debo fusionar en función de si un valor de fecha se ajusta o no entre otras dos fechas. Básicamente, necesito realizar una combinación externa donde B.event_date esté entre A.start_date y A.end_date . Parece que fusionar y unir siempre asume una columna común que, en este caso, no tengo.

  AB start_date end_date event_date price 0 2017-03-27 2017-04-20 0 2017-01-20 100 1 2017-01-10 2017-02-01 1 2017-01-27 200 Result start_date end_date event_date price 0 2017-03-27 2017-04-20 1 2017-01-10 2017-02-01 2017-01-20 100 2 2017-01-10 2017-02-01 2017-01-27 200 

Crear datos y formatear a tiempos de datos:

 df_A = pd.DataFrame({'start_date':['2017-03-27','2017-01-10'],'end_date':['2017-04-20','2017-02-01']}) df_B = pd.DataFrame({'event_date':['2017-01-20','2017-01-27'],'price':[100,200]}) df_A['end_date'] = pd.to_datetime(df_A.end_date) df_A['start_date'] = pd.to_datetime(df_A.start_date) df_B['event_date'] = pd.to_datetime(df_B.event_date) 

Crear claves para hacer una unión cruzada:

 df_A = df_A.assign(key=1) df_B = df_B.assign(key=1) df_merge = pd.merge(df_A, df_B, on='key').drop('key',axis=1) 

Filtre los registros que no cumplan con los criterios de fechas de eventos entre las fechas de inicio y finalización:

 df_merge = df_merge.query('event_date >= start_date and event_date <= end_date') 

Únete de nuevo a la tabla de rango de fechas original y suelta la columna clave

 df_out = df_A.merge(df_merge, on=['start_date','end_date'], how='left').fillna('').drop('key', axis=1) print(df_out) 

Salida:

  end_date start_date event_date price 0 2017-04-20 00:00:00 2017-03-27 00:00:00 1 2017-02-01 00:00:00 2017-01-10 00:00:00 2017-01-20 00:00:00 100 2 2017-02-01 00:00:00 2017-01-10 00:00:00 2017-01-27 00:00:00 200