如何按时间区间匹配两个DataFrame执行left join关联
Pandas 按时间区间匹配关联两个DataFrame实现
需求梳理
- 维度表
df1:存储分时段定价规则,包含Time Interval(时间区间)、Price(价格,单位:美元)两个字段,示例规则:- 10:00-11:00 对应价格15
- 11:00-12:00 对应价格10
- 15:00-16:00 对应价格18
- 业务表
df2:存储发车记录,包含Van(车辆编号)、Route(线路)、Departure Time(发车时间)三个字段,共4条记录 - 关联规则:以
df2为左表做左连接,判断每条记录的发车时间落在df1的哪个时间区间内,匹配对应时段价格,最终输出字段为Van、Route、Departure Time、Price
实现步骤
- 统一时间格式:时间字段不能直接用字符串做区间判断,需要先转为pandas内置的datetime类型
- 拆分时间区间:将
df1中字符串格式的时间区间拆分为区间开始、结束两个时间点 - 区间匹配:逐行判断发车时间所属的价格区间,绑定对应价格
- 字段裁剪:输出要求的4个字段即可
完整可运行代码
import pandas as pd # 构造df1时间区间定价表 df1 = pd.DataFrame({ "Time Interval": ["10:00-11:00", "11:00-12:00", "15:00-16:00"], "Price": [15, 10, 18] }) # 拆分时间区间为开始、结束时间,统一转为datetime格式 df1[["start_t", "end_t"]] = df1["Time Interval"].str.split("-", expand=True) df1["start_t"] = pd.to_datetime(df1["start_t"], format="%H:%M") df1["end_t"] = pd.to_datetime(df1["end_t"], format="%H:%M") # 构造df2发车记录示例表 df2 = pd.DataFrame({ "Van": ["Van001", "Van002", "Van003", "Van004"], "Route": ["RouteA", "RouteB", "RouteA", "RouteC"], "Departure Time": ["10:30", "11:15", "15:20", "12:30"] }) # 发车时间转为datetime格式 df2["depart_t"] = pd.to_datetime(df2["Departure Time"], format="%H:%M") # 定义区间价格匹配函数 def get_price(depart_time): # 区间采用左闭右开规则,避免边界时间重复匹配 match_res = df1[(df1["start_t"] <= depart_time) & (df1["end_t"] > depart_time)] return match_res["Price"].iloc[0] if not match_res.empty else None # 匹配价格 df2["Price"] = df2["depart_t"].apply(get_price) # 输出最终结果 final_result = df2[["Van", "Route", "Departure Time", "Price"]] print(final_result)
运行结果
| Van | Route | Departure Time | Price |
|---|---|---|---|
| Van001 | RouteA | 10:30 | 15.0 |
| Van002 | RouteB | 11:15 | 10.0 |
| Van003 | RouteA | 15:20 | 18.0 |
| Van004 | RouteC | 12:30 | NaN |
注意事项
- 时间匹配前必须统一转为datetime类型,直接用字符串比较可能出现格式不兼容、大小判断错误的问题
- 区间判断采用左闭右开规则
[start, end),可以避免11:00、12:00这类整点边界时间同时命中两个区间的问题 - 左连接逻辑下,没有匹配到任何定价区间的发车记录,Price字段会返回空值
NaN,符合关联要求
内容的提问来源于stack exchange,提问作者Mateo Guajardo
相关产品推荐
相关产品推荐

