NGSIM数据集Python处理(按照路段和车型筛选数据)

关于NGSIM数据集的介绍不再赘述,详见他人文章:(29条消息) NGSIM数据集相关解释_29世纪杀马特的博客-优快云博客_ngsim数据集

本文章主要通过Python完成NGSIM数据集按路段和车型的筛选,话不多说,直接上代码:

import pandas as pd
from pathlib import Path
datas = pd.read_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data.csv')

def main():
    choice = int(input('请输入需要提取数据的路段(1.i-80;2.us-101;3.larkershim;4.peachtree):'))
    if choice==1:
        i_80()
    if choice==2:
        us_101()
    if choice==3:
        larkershim()
    if choice==4:
        peachtree()

def i_80():
    """获取i-80道路上的数据"""
    datas_i_80=datas[datas.Location=='i-80']
    """"按车辆类型进行数据读取"""
    answer=int(input('请输出需要提取的车辆类型数据(1.摩托车;2.小型车;3.大型车):'))
    if answer==1:
        datas_i_80_m=datas_i_80[datas_i_80.v_Class==1]
        datas_i_80_m.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\I-80\\摩托车数据.csv')
        print('i-80路段,摩托车数据已导出完毕')
    if answer==2:
        datas_i_80_c = datas_i_80[datas_i_80.v_Class == 2]
        datas_i_80_c.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\I-80\\小型车数据.csv')
        if datas_i_80_c.shape[0]>1048765:
            split_i_80_c()
        print('i-80路段,小型车数据已导出完毕')
    if answer==3:
        datas_i_80_t = datas_i_80[datas_i_80.v_Class == 3]
        datas_i_80_t.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\I-80\\大型车数据.csv')
        print('i-80路段,大型车数据已导出完毕')
    quertion()

def us_101():
    datas_us_101 = datas[datas.Location == 'us-101']
    answer = int(input('请输出需要提取的车辆类型数据(1.摩托车;2.小型车;3.大型车):'))
    if answer == 1:
        datas_us_101_m = datas_us_101[datas_us_101.v_Class == 1]
        datas_us_101_m.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\US-101\\摩托车数据.csv')
        print('us-101路段,摩托车数据已导出完毕')
    if answer == 2:
        datas_us_101_c = datas_us_101[datas_us_101.v_Class == 2]
        datas_us_101_c.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\US-101\\小型车数据.csv')
        if datas_us_101_c.shape[0]>1048765:
            split_us_101_c()
        print('us-101路段,小型车数据已导出完毕')
    if answer == 3:
        datas_us_101_t = datas_us_101[datas_us_101.v_Class == 3]
        datas_us_101_t.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\US-101\\大型车数据.csv')
        print('us-101路段,大型车数据已导出完毕')
    quertion()

def larkershim():
    datas_lankershim = datas[datas.Location == 'lankershim']
    answer = int(input('请输出需要提取的车辆类型数据(1.摩托车;2.小型车;3.大型车):'))
    if answer == 1:
        datas_lankershim_m = datas_lankershim[datas_lankershim.v_Class == 1]
        datas_lankershim_m.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\lankershim\\摩托车数据.csv')
        print('lankershim路段,摩托车数据已导出完毕')
    if answer == 2:
        datas_lankershim_c = datas_lankershim[datas_lankershim.v_Class == 2]
        datas_lankershim_c.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\lankershim\\小型车数据.csv')
        if datas_lankershim_c.shape[0]>1048765:
            split_lankershim_c()
        print('lankershim路段,小型车数据已导出完毕')
    if answer == 3:
        datas_lankershim_t = datas_lankershim[datas_lankershim.v_Class == 3]
        datas_lankershim_t.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\lankershim\\大型车数据.csv')
        print('lankershim路段,大型车数据已导出完毕')
    quertion()

def peachtree():
    datas_peachtree = datas[datas.Location == 'peachtree']
    answer = int(input('请输出需要提取的车辆类型数据(1.摩托车;2.小型车;3.大型车):'))
    if answer == 1:
        datas_peachtree_m = datas_peachtree[datas_peachtree.v_Class == 1]
        datas_peachtree_m.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\peachtree\\摩托车数据.csv')
        print('peachtree路段,摩托车数据已导出完毕')
    if answer == 2:
        datas_peachtree_c = datas_peachtree[datas_peachtree.v_Class == 2]
        datas_peachtree_c.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\peachtree\\小型车数据.csv')
        if datas_peachtree_c.shape[0]>1048765:
            split_peachtree_c()
        print('peachtree路段,小型车数据已导出完毕')
    if answer == 3:
        datas_lankershim_t = datas_peachtree[datas_peachtree.v_Class == 3]
        datas_lankershim_t.to_csv('D:\\BaiduNetdiskDownload\\NGSIM_Data\\peachtree\\大型车数据.csv')
        print('peachtree路段,大型车数据已导出完毕')
    quertion()

def split_lankershim_c():
    res_file_path = Path(r'D:\\BaiduNetdiskDownload\\NGSIM_Data\\lankershim\\小型车数据.csv')  # 仅修改待分割文件路径即可
    split_size = 1000000
    tar_dir = res_file_path.parent / ("split_" + res_file_path.name.split(".")[0])
    if not tar_dir.exists():
        tar_dir.mkdir()
        print("创建文件夹\t" + str(tar_dir))
    print("目标路径:\t" + str(tar_dir))
    print("分割文件:\t" + str(res_file_path))
    print("分割大小:\t" + "{:,}".format(split_size))
    tmp = pd.read_csv(res_file_path, nrows=10)
    columns = tmp.columns.to_list()
    idx = 0
    while (len(tmp) > 0):
        start = 1 + (idx * split_size)
        tmp = pd.read_csv(res_file_path,
                          header=None,
                          names=columns,
                          skiprows=start,
                          nrows=split_size)
        if len(tmp) <= 0:
            break
        file_name = res_file_path.name.split(".")[0] + "_{}_{}".format(start, start + len(tmp)) + ".csv"
        file_path = tar_dir / file_name
        tmp.to_csv(file_path, index=False)
        idx += 1
        print(file_name + "\t切割成功")

def split_i_80_c():
    res_file_path = Path(r'D:\\BaiduNetdiskDownload\\NGSIM_Data\\I-80\\小型车数据.csv')  # 仅修改待分割文件路径即可
    split_size = 1000000
    tar_dir = res_file_path.parent / ("split_" + res_file_path.name.split(".")[0])
    if not tar_dir.exists():
        tar_dir.mkdir()
        print("创建文件夹\t" + str(tar_dir))
    print("目标路径:\t" + str(tar_dir))
    print("分割文件:\t" + str(res_file_path))
    print("分割大小:\t" + "{:,}".format(split_size))
    tmp = pd.read_csv(res_file_path, nrows=10)
    columns = tmp.columns.to_list()
    idx = 0
    while (len(tmp) > 0):
        start = 1 + (idx * split_size)
        tmp = pd.read_csv(res_file_path,
                          header=None,
                          names=columns,
                          skiprows=start,
                          nrows=split_size)
        if len(tmp) <= 0:
            break
        file_name = res_file_path.name.split(".")[0] + "_{}_{}".format(start, start + len(tmp)) + ".csv"
        file_path = tar_dir / file_name
        tmp.to_csv(file_path, index=False)
        idx += 1
        print(file_name + "\t切割成功")

def split_peachtree_c():
    res_file_path = Path(r'D:\\BaiduNetdiskDownload\\NGSIM_Data\\peachtree\\小型车数据.csv')  # 仅修改待分割文件路径即可
    split_size = 1000000
    tar_dir = res_file_path.parent / ("split_" + res_file_path.name.split(".")[0])
    if not tar_dir.exists():
        tar_dir.mkdir()
        print("创建文件夹\t" + str(tar_dir))
    print("目标路径:\t" + str(tar_dir))
    print("分割文件:\t" + str(res_file_path))
    print("分割大小:\t" + "{:,}".format(split_size))
    tmp = pd.read_csv(res_file_path, nrows=10)
    columns = tmp.columns.to_list()
    idx = 0
    while (len(tmp) > 0):
        start = 1 + (idx * split_size)
        tmp = pd.read_csv(res_file_path,
                          header=None,
                          names=columns,
                          skiprows=start,
                          nrows=split_size)
        if len(tmp) <= 0:
            break
        file_name = res_file_path.name.split(".")[0] + "_{}_{}".format(start, start + len(tmp)) + ".csv"
        file_path = tar_dir / file_name
        tmp.to_csv(file_path, index=False)
        idx += 1
        print(file_name + "\t切割成功")

def split_us_101_c():
    res_file_path = Path(r'D:\\BaiduNetdiskDownload\\NGSIM_Data\\US-101\\小型车数据.csv')  # 仅修改待分割文件路径即可
    split_size = 1000000
    tar_dir = res_file_path.parent / ("split_" + res_file_path.name.split(".")[0])
    if not tar_dir.exists():
        tar_dir.mkdir()
        print("创建文件夹\t" + str(tar_dir))
    print("目标路径:\t" + str(tar_dir))
    print("分割文件:\t" + str(res_file_path))
    print("分割大小:\t" + "{:,}".format(split_size))
    tmp = pd.read_csv(res_file_path, nrows=10)
    columns = tmp.columns.to_list()
    idx = 0
    while (len(tmp) > 0):
        start = 1 + (idx * split_size)
        tmp = pd.read_csv(res_file_path,
                          header=None,
                          names=columns,
                          skiprows=start,
                          nrows=split_size)
        if len(tmp) <= 0:
            break
        file_name = res_file_path.name.split(".")[0] + "_{}_{}".format(start, start + len(tmp)) + ".csv"
        file_path = tar_dir / file_name
        tmp.to_csv(file_path, index=False)
        idx += 1
        print(file_name + "\t切割成功")

def quertion():
        question=int(input('是否继续导出数据?(1.是;2.否):'))
        if question==1:
            main()
        if question==2:
            print('程序关闭')


if __name__ == '__main__':
    main()



Excel中仅能显示1048765行数据,split_lankershim_c(),split_i_80_c(),split_peachtree_c(),split_us_101_c()四个函数对数据进行切割,以便于将最后筛选的数据在Excel中进行显示。

若有疑问或有交通数据处理需求欢迎VX探讨:A2528945820

<think>好的,用户现在的问题是关于如何从NGSIM数据集筛选出I-80公路的数据。之前他们问过如何筛选特定车道速度的数据,现在转向了按公路筛选。首先,我需要回忆一下NGSIM数据集的结构。 NGSIM包含US-101I-80两条公路的数据,通常这些数据可能存储在不同的文件中,或者同一个文件中有标识公路的字段。用户可能已经下载了数据集,但不确定文件结构,所以需要指导他们如何识别提取特定公路的数据。 首先,我需要确认用户的数据文件命名或结构。通常,NGSIM数据集可能将不同公路的数据分开存放,比如有单独的文件如i80_trajectories.csvus101_trajectories.csv。如果是这种情况,用户只需要直接读取对应的文件即可。但可能也存在将所有数据合并到一个文件中的情况,这时就需要检查数据中是否有标识公路的字段,比如Location或Roadway。 接下来,我需要考虑用户可能的文件结构。如果他们不确定文件是否分开,需要指导他们检查文件名或列名。例如,文件名中的i80可能表示I-80公路的数据。如果数据在同一个文件中,可能需要用pandas读取并筛选特定列的值。 然后,我应该给出两种情况的解决方案:一种是文件已分开的情况,直接读取对应的文件;另一种是数据合并的情况,通过列来筛选。同时,提醒用户注意数据清洗,比如处理缺失值或重复数据,以及单位转换的问题,因为NGSIM数据可能使用英制单位。 还需要考虑用户可能的后续需求,比如筛选后的数据处理或分析,可以建议他们进一步的问题。同时,确保回答结构清晰,分步骤说明,并提供示例代码,这样用户可以直接应用。 最后,检查是否需要补充其他常见筛选场景或注意事项,确保用户能够顺利完成任务,避免常见错误。例如,确认列名是否正确,处理数据时的路径问题,或者是否需要转换时间格式等。</think>以下是筛选NGSIM数据集中I-80公路数据的详细方法(根据NGSIM官方数据结构设计): --- ### 一、数据文件识别 NGSIM数据路段独立存储,I-80公路数据通常包含在以下文件中: ``` i80_trajectories-****.txt # 车辆轨迹数据(主文件) i80_events.csv # 换道事件标注 i80_vehicle_types.csv # 车辆类型补充信息 ``` --- ### 二、筛选方法 #### 方案1:直接读取I-80专用文件(推荐) ```python import pandas as pd # 直接加载I-80公路的轨迹文件 i80_df = pd.read_csv('i80_trajectories.csv') # 文件名可能含版本号如i80_trajectories-0750am-0805am.txt # 验证数据量(I-80典型数据规模) print(f"I-80公路数据量:{len(i80_df):,} 条轨迹点") # 正常应输出约 600,000 行 ``` #### 方案2:从混合文件中筛选(如果数据被合并) ```python # 假设存在包含所有道路的合并文件 combined_df = pd.read_csv('all_roads.csv') # 通过Location字段筛选(需确认数据是否包含此列) i80_df = combined_df[combined_df['Location'] == 'I-80'] # 或通过路段原点坐标判断(I-80原点坐标X=32.4,Y=75.2) i80_df = combined_df[ (combined_df['Global_X'].between(32, 33)) & (combined_df['Global_Y'].between(75, 76)) ] ``` --- ### 三、关键字段验证 筛选后需检查以下I-80特有特征: | 属性 | I-80典型值 | US-101对比值 | |----------------------|---------------------|--------------------| | 路段长度 | 500米 | 640米 | | 车道数 | 6车道 | 5车道 | | 数据采集时段 | 4:00-4:15 PM | 7:50-8:35 AM | | 平均车头时距 | 1.2秒 | 0.8秒 | --- ### 四、数据清洗建议 ```python # 排除异常值(I-80数据常见问题) clean_i80 = i80_df[ (i80_df['v_Vel'] > 0) & # 速度>0 (i80_df['Lane_ID'].between(1, 6)) & # 有效车道号1-6 (i80_df['Global_X'] > 0) & # 坐标有效性 (i80_df['Following'].ne(0)) # 排除无前车数据 ] # 时间格式转换(I-80时间戳为毫秒级) clean_i80['Absolute_Time'] = pd.to_datetime(clean_i80['Global_Time'], unit='ms') ``` --- ### 五、扩展应用 若需要结合地理信息,建议使用I-80的GIS参考点: ```python # I-80路段起点坐标(加州Emeryville区域) start_point = (37.8314, -122.2928) # 纬度,经度 # 坐标转换示例(将Local X/Y转换为WGS84) clean_i80['Longitu
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惜君如常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值