'DF with values for Time Intervals

I am trying to make a manual dataframe.. I would like to have a time stamp with a time interval, for example:

df1:

Time Interval Price
10:00 - 11:00 $15
11:00 - 12:00 $10
15:00 - 16:00 $18

So when I do a left join with df2:

Van Route Departure Time
223 NY-RO 10:35
655 LA-SD 15:15
987 LA-SF 15:50
278 LA-SD 11:45

The result will be:

Van Route Departure Time Price
223 NY-RO 10:35 $15
655 LA-SD 15:15 $18
987 LA-SF 15:50 $18
278 LA-SD 11:45 $10


Solution 1:[1]

I think you can use merge_asof on the Departure Times. Note that it expects the columns to be merged on to be sorted, so we sort by time first.

df1['Departure Time'] = pd.to_datetime(df1['Time Interval'].str.split(' - ').str[0])
df2['Departure Time'] = pd.to_datetime(df2['Departure Time'])
out = (pd.merge_asof(df2.sort_values(by='Departure Time'), 
                     df1.sort_values(by='Departure Time'), on='Departure Time')
       .drop(columns=['Time Interval']))
out['Departure Time'] = out['Departure Time'].dt.strftime('%H:%M')

Output:

   Van  Route Departure Time Price
0  223  NY-RO          10:35   $15
1  278  LA-SD          11:45   $10
2  655  LA-SD          15:15   $18
3  987  LA-SF          15:50   $18

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1