如何从含多行表头的Pandas DataFrame正确读取交通数据?
解决Excel交通流量数据读取与筛选问题
一、正确读取带复合表头的Excel数据
你的Excel表头是两行结构(第一行是方向:西向/北向等,第二行是转向:右转/左转等,同时第二行包含Start Time列),直接用skiprows会丢失表头信息,正确做法是指定两行作为复合表头:
import pandas as pd # 读取时指定Excel第9、10行(对应pandas的0-based索引8、9)作为表头 df = pd.read_excel("你的文件路径.xlsx", sheet_name="目标工作表", header=[8,9]) # 合并复合表头,处理Start Time列的空表头 df.columns = [ f"{dir}_{turn}" if dir else time_col for dir, time_col in df.columns ] # 转换Start Time为时间类型(方便后续时段筛选) df["Start Time"] = pd.to_datetime(df["Start Time"]).dt.time
这样处理后,你会得到清晰的列名(比如西向_右转、北向_左转)和正常的Start Time时间列,不会丢失任何表头信息。
二、按时段+交通流向筛选数据
1. 定义时段规则
先根据需求设置时段筛选条件,比如:
# 早高峰7-8点 morning_peak = (df["Start Time"] >= pd.to_datetime("07:00:00").time()) & \ (df["Start Time"] <= pd.to_datetime("08:00:00").time()) # 其他时段可类似定义 # noon_peak = ... # night = ...
2. 筛选目标数据
直接用loc按条件定位行和列,无需依赖iloc或get_loc()(位置索引远不如列名直观):
# 获取早高峰7-8点西向右转的流量数据 target_data = df.loc[morning_peak, "西向_右转"].tolist() # 按你需要的格式输出 print(" ".join(map(str, target_data)))
输出示例:
28 38 39 42 43
关键说明
- 复合表头读取:用
header=[n,m]可直接将两行作为多级表头,再通过字符串拼接合并成易识别的列名,完美保留方向+转向的组合信息。 - 时段筛选:将
Start Time转为time类型后,直接用时间范围判断即可完成时段分组。 - 列定位:合并后的列名直接对应“方向_转向”,用
loc按列名取值比位置索引更直观,不易出错。
内容的提问来源于stack exchange,提问作者Ace_1918
相关产品推荐
相关产品推荐

