一.前景概述
- 专题1回顾
NGSIM数据集:《NGSIM数据集》
NGSIM数据集处理程序(跟驰车辆):《NGSIM数据处理程序(跟驰车辆)》
我们在专题1中将NGSIM数据集切割成11个小部分,如图1所示。
- 专题2回顾
在专题2中按照路段类型不同分为:“i-80”、“lankershim”、“Peachtree”、“us-101”四种路段类型,并根据路段不同将NGSIM数据集做了初步筛选,以“i-80”路段为例,如图2所示为该路段下的数据集。
当我们打开一个csv文件后会发现数据存储是没有规律可循的。如图3所示,csv文件中包含了不同车辆ID的字段,且顺序排列并不规律。所以我们需要将同一车辆ID的字段提取出来进行分类存储。
- 专题3回顾
在专题3中我们按照车辆ID的不同,对各个路段下的数据集按照车辆ID不同进行了分类。以“i-80”路段为例,图4中的文件夹分别对应了图2中的csv文件,对每个csv文件按照车辆ID的不同对字段进行提取和存储,如图5所示为按车辆ID不同分类好的数据集,每个csv文件的名称就代表了车辆ID。
二.代码编辑过程
本部分采用Python作为编程工具,使用面向对象进行代码编译。
1.创建用于获取csv文件的类
- 代码展示1
def Exist_List(self,path_exist):
"""
获取目标路径下的文件夹或文件
:param path_exist: 目标路径
:return:
"""
object_list = os.listdir(path_exist)
return object_list
该方法用以获取目标路径下由文件和文件夹组成的列表。主要用“os.listdir()”来实现的。
- 代码展示2
def Exist_Dict(self,path_exist,object_dict):
"""
:param path_exist:
:param object_dict:
:return:
"""
for sub_object in self.Exist_List(path_exist):
object_path = f"{path_exist}\\{sub_object}"
sub_object_list = os.listdir(object_path)
object_dict[sub_object] = sub_object_list
该方法对获取的含有文件和文件夹的列表进行遍历,并获取主路径对应的子级路径下的文件和文件夹。
- 代码展示3
def Csv_Dict(self):
"""
存储csv文件的字典
:return:
"""
for folder in self.Folder_List(self.path):
folder_path = f"{self.path}\\{folder}"
self.Exist_Dict(folder_path,self.csv_dict)
return self.csv_dict # 返回存储csv文件的字典
该方法使用以将读取的csv文件进行存储(以字典的形式存储)。
2.创建用于合并csv文件的类
- 代码展示1
def Select_Csv_Name(self,csv_name_set):
"""
筛选csv文件名
:param csv_name_set:
:return:
"""
for sub_folder,csv_list in self.Csv_dict().items(): # 遍历存放csv文件的字典
for csv in csv_list:
csv_name_tuple = os.path.splitext(csv) # 包含csv文件名和扩展名的元组
csv_name_list = list(csv_name_tuple) # 数据类型转换:元组转列表
csv_name_set.add(csv_name_list[0])
该方法是用以将获取的csv文件的文件名和扩展名做分离处理,并提取文件名。
- 代码展示2
def Save_Csv_Name(self,csv_name_dict):
"""
将csv文件名以键值对的形式存储在相对应的字典中
:param csv_name_dict:
:return:
"""
for folder in self.Folder_list():
csv_name_set = set() # 空集合
self.Select_Csv_Name(csv_name_set)
csv_name_list = list(csv_name_set) # 将集合转换成列表
csv_name_list.sort(reverse=False) # 升序排序
csv_name_dict[folder ] = csv_name_list
return csv_name_dict
将csv文件的文件名以键值对的形式存储在相对应的字典中。
- 代码展示3
在这里插入代码 def Create_Folder(self,path):
"""
创建文件夹
:param path: 创建路径
:return:
"""
isExists = os.path.exists(path) # 判断路径是否存在
try:
if not isExists: # 如果路径不存在
os.makedirs(path)
else:
pass
except FileExistsError: # 异常判断
print("文件夹已存在")片
该部分代码用以创建文件夹。
- 代码展示4
def Delect_Folder(self,path_folder):
"""
删除文件夹
:param path_folder:目标文件夹路径
:return:
"""
name_list = os.listdir(path_folder) # 获取目标文件夹下所有的文件夹和文件,并存放在列表中
for name in name_list: # 遍历存放文件夹和文件的列表
sub_path = f"{path_folder}\\{name}"
if os.path.isfile(sub_path): # 如果判断路径为文件,则跳出当前循环,并执行下一次循环
if os.path.getsize(sub_path) == 0: # 如果文件为空文件
os.remove(sub_path) # 删除空文件
else:
continue # 否则退出循环,进入下一个循环
if os.path.isdir(sub_path): # 判断是否为目录
if not os.listdir(sub_path): # 如果为空目录
os.rmdir(sub_path) # 删除空目录或空文件
else:
continue # 否则退出循环,进入下一个循环
该部分代码是用以删除空文件夹。
- 代码展示5
关于csv文件的合并主程序可以参考《NGSIM数据处理程序(跟驰车辆)》中的"Veh_ID_Combine.py"文件,里面详细介绍了代码编译过程。
三.总结
本部分是对专题3中删选的数据集做了合并处理,从而使得同一个车辆ID的字段能够存储在一个csv文件中。文件合并结果如图8所示。关于NGSIM数据集的详细处理可以参考《NGSIM数据处理程序(跟驰车辆)》;NGSIM数据集可以从《NGSIM数据集》获取。