本文通过Python代码的编写,实现对NGSIM数据I-80路段小型车数据中产生变道行为的车辆进行筛选。关于前期数据的准备,可参看本人原来发表的资源和文章
NGSIM数据.zip-交通文档类资源-CSDN文库
去除重复项后NGSIM数据-数据集文档类资源-CSDN文库
NGSIM数据集Python处理(按照路段和车型筛选数据)_Mr.J的博客-CSDN博客
NGSIM数据集中会存在ID被复用的情况,以同一ID数据的全局时间间断点作为索引构建切割索引列表。该部分代码如下:
lst_Global_Time = list(new_data.loc[:, 'Global_Time'])
for i in range(len(new_data) - 1):
if lst_Global_Time[i + 1] - lst_Global_Time[i] != 100:
lst_c.append(i + 1)
lst_c.insert(0, 0)
lst_c.append(len(lst_Global_Time))
lst_c.sort()
而后对同一ID车辆数据按切割索引列表进行切割,进而判断每一车辆是否产生变道行为,代码如下:
for j in range(len(lst_c)-1):
S_S_data=new_data.iloc[lst_c[j]:lst_c[j+1]].copy() #获取每一车辆数据
lst_Lane_ID=S_S_data['Lane_ID']
new_lst_Lane_ID=list(np.diff(lst_Lane_ID)) #获取连续时间车道差值列表
if new_lst_Lane_ID.count(-1)>0 or new_lst_Lane_ID.count(1)>0:
finally_data=finally_data.append(S_S_data)
完整代码如下:
import pandas as pd
import numpy as np
finally_data=pd.DataFrame() #保存最终结果
lst_c=[] #储存切割索引
num=0 #计数
data=pd.read_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\I-80\\小型车数据.csv')
for ID in set(data.Vehicle_ID):
new_data = data[data.Vehicle_ID == ID].sort_values(by='Global_Time')
'''获取同一ID数据切割索引列表'''
lst_Global_Time = list(new_data.loc[:, 'Global_Time'])
for i in range(len(new_data) - 1):
if lst_Global_Time[i + 1] - lst_Global_Time[i] != 100:
lst_c.append(i + 1)
lst_c.insert(0, 0)
lst_c.append(len(lst_Global_Time))
lst_c.sort()
'''切割并处理同一ID对应的不同车辆'''
for j in range(len(lst_c)-1):
S_S_data=new_data.iloc[lst_c[j]:lst_c[j+1]].copy() #获取每一车辆数据
lst_Lane_ID=S_S_data['Lane_ID']
new_lst_Lane_ID=list(np.diff(lst_Lane_ID)) #获取连续时间车道差值列表
if new_lst_Lane_ID.count(-1)>0 or new_lst_Lane_ID.count(1)>0:
finally_data=finally_data.append(S_S_data)
num+=1
print('ID为'+str(ID)+'的车辆满足筛选条件')
lst_c.clear()
print('共有'+str(num)+'辆车辆进行了变道')
finally_data.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\I-80\\小型车变道数据.csv')
若有疑问或有交通数据处理需求欢迎VX探讨:A2528945820