使用Python+SUMO Traci导出停车数据至Excel遇ValueError求助
问题排查与修复方案
错误原因
- 数据结构不匹配:你定义的
parkingList是一维列表(包含7个元素),但pandas.DataFrame要求传入二维结构(每个子列表代表一行数据)。当传入一维列表时,pandas会将每个元素解析为一行、1列的数据,但你指定了7列,导致形状(7,1)与预期(7,7)不匹配,触发ValueError。 - 数据丢失:遍历停车区域时,每次直接赋值
parkingList = [...]会覆盖之前的数据,最终仅保留最后一个停车区域的信息。 - 缩进错误:代码中部分逻辑的缩进位置错误,导致仿真步执行后未正确进入停车区域数据收集流程。
修复代码
import traci import time import traci.constants as tc import pytz import datetime from random import randrange import pandas as pd def getdatetime(): utc_now = pytz.utc.localize(datetime.datetime.utcnow()) currentDT = utc_now.astimezone(pytz.timezone("Asia/Riyadh")) DATIME = currentDT.strftime("%Y-%m-%d %H:%M:%S") return DATIME sumoCmd = ["sumo", "-c", "cologne6to8.sumocfg"] traci.start(sumoCmd) # 运行仿真直到结束 while traci.simulation.getMinExpectedNumber() > 0: traci.simulationStep() # 初始化空列表用于收集所有停车区域数据 parkingList = [] ParkingAreas = traci.parkingarea.getIDList() for parking_id in ParkingAreas: lane = traci.parkingarea.getLaneID(parking_id) startpos = traci.parkingarea.getStartPos(parking_id) endpos = traci.parkingarea.getEndPos(parking_id) vehCount = traci.parkingarea.getVehicleCount(parking_id) vehid = traci.parkingarea.getVehicleIDs(parking_id) # 将当前停车区域数据作为子列表追加到总列表 parkingList.append([getdatetime(), parking_id, lane, startpos, endpos, vehCount, vehid]) traci.close() # 生成Excel文件 columnnames = ['dateandtime', 'parkingAreaID', 'Lane', 'start pos', 'end pos', 'numVehStops', 'vehIDsAtStop'] # 此时parkingList是二维结构,与列数匹配 dataset = pd.DataFrame(parkingList, columns=columnnames) dataset.to_excel("outputparking.xlsx", index=False) time.sleep(5)
关键修改说明
- 初始化空列表:将
parkingList初始化为[],通过append()方法收集每个停车区域的数据行,保证最终是二维结构。 - 遍历优化:直接遍历
ParkingAreas中的每个ID,替代range(len())的写法,代码更简洁。 - 缩进修正:确保仿真循环结束后再执行停车区域数据收集,逻辑顺序正确。
- DataFrame参数简化:去掉不必要的
index=None,columns参数与二维列表的列数完全匹配。
内容的提问来源于stack exchange,提问作者ASh
相关产品推荐
相关产品推荐

