数模-汽车行驶工况构建(2019D-研赛)(研究了一部分)

采样时间

image

上面的采集总时长计算:拿文件一为例->因为数据总量为185725行 采样频率为1HZ 也就是1s采集一次
所以185725/2600=51.59个小时

另外用Python计算两个事件相差的小时:

from dateutil.parser import parse
a = parse('2017-12-18/13:42:13')
b = parse('2017-12-24/13:37:49')
print((b-a).total_seconds()/3600)

image

经纬度->文章中写出大致地区

image

image

pandas库pd.read_excel操作读取excel文件

除了使用xlrd库或者xlwt库进行对excel表格的操作读与写,而且pandas库同样支持excel的操作;且pandas操作更加简介方便。

首先是pd.read_excel的参数:函数为:

pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None,
                arse_cols=None,date_parser=None,na_values=None,thousands=None, 
                convert_float=True,has_index_names=None,converters=None,dtype=None,
                true_values=None,false_values=None,engine=None,squeeze=False,**kwds)

表格数据:

image

常用参数解析:

  • io :excel 路径;
import pandas as pd
#定义路径IO
IO = '文件1.xlsx'
#读取excel文件
sheet = pd.read_excel(io=IO)
#此处由于sheetname默认是0,所以返回第一个表
print(sheet)
#上述列表返回的结果和原表格存在合并单元格的差异

image

关于更多pandas库pd.read_excel操作读取excel文件 可看下面这个博客

Python之pandas库pd.read_excel操作读取excel文件

去加速度异常值代码

import numpy as np
import pandas as pd
import datetime
import copy
speedU=[]            #加速不合要求 Vup>100/7
speedD=[]            #减速不合要求 Vdn>28.8
data1 = pd.read_excel('C:\\Users\\lijun78\Desktop\\D题\\文件1.xlsx')  #原始数据

image

data1 = pd.DataFrame(data1)#DataFrame的单元格可以存放数值、字符串
data1 = np.array(data1)#转化为数值型

image

然后创建原始数据副本(记录处理后最终数据)

data1_out=copy.deepcopy(data1) #原始数据副本(记录处理后最终数据)

python中copy()和deepcopy()详解

寻找断续时间节点

将data1中日期的那一列转为标准型

image

找两行数据之间时间差

image

接下来就是遍历输出断续时间节点

#寻找断续时间节点
for i in range(data1.shape[0]-1): #data1.shape[0]-1是数据的行数
    date1=datetime.datetime.strptime(data1[i][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    #datetime.datetime.strptime:万能的日期格式转换
    #data1[i][0]对应日期那一列
    date2=datetime.datetime.strptime(data1[i+1][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    ss=(date2-date1).seconds
    if ss!=1:
        time_inc+=[[i,ss]]
time_inc=np.array(time_inc)
time_inc=time_inc+np.array([1,0]*time_inc.shape[0]).reshape([time_inc.shape[0],2])
time_inc=pd.DataFrame(time_inc)
time_inc.to_excel('C:\\Users\\lijun78\Desktop\\D题\\time_inc.xlsx') #输出断续时间节点

image

image

下面是具体代码的展示

image

image

image

image

缺失数据补充(仅补充间隔 1 秒)

python中tolist()命令

datetime.timedelta类介绍

测试代码:

image

image

image

最终代码

#缺失数据补充(仅补充间隔 1 秒)
ff1=[] #过渡列表,给原始数据补充 1 秒缺失数据
i=0
j=data1_out.shape[0]-1 #跟踪待补充数据表维度
data1_out=data1_out.tolist() #向量转列表
while(i<j):
    date3=datetime.datetime.strptime(data1_out[i][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    date4=datetime.datetime.strptime(data1_out[i+1][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    ss=(date4-date3).seconds
    if ss==2:
        ff1=[(date3+datetime.timedelta(seconds=1)).strftime('%Y/%m/%d %H:%M:%S')] #在date3的基础上增加1s
        ff1=ff1+(1/2*(np.array(data1_out[i+1][1:])+np.array(data1_out[i][1:]))).tolist()
        data1_out.insert(i+1,ff1)
        j=j+1
    i=i+1

image

新数据中寻找加减速异常数据

np.delete详解

#新数据中寻找加减速异常数据
for i in range(len(data1_out)-1):
    date5 =datetime.datetime.strptime(data1_out[i][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    date6 =datetime.datetime.strptime(data1_out[i+1][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    ss=(date6-date5).seconds
    if (data1_out[i+1][1]-data1_out[i][1])/ss>100/7:
        speedU.append(i+1)
    if (data1_out[i][1]-data1_out[i+1][1])/ss>28.8:
        speedD.append(i+1)
data1_out=np.array(data1_out)
#剔除异常数据
data1_out=np.delete(data1_out,speedU,axis=0)
data1_out=np.delete(data1_out,speedD,axis=0)
#数据导出,加减速异常数据节点
speedU=np.array(speedU)
speedD=np.array(speedD)
print(speedU)
speedU=speedU+np.ones([1,speedU.shape[0]])
speedD=speedD+np.ones([1,speedD.shape[0]])
print(speedU)
speedU=pd.DataFrame(speedU.T)
speedD=pd.DataFrame(speedD.T)
speedU.to_excel('C:\\Users\\lijun78\Desktop\\D题\\speedU.xlsx') #输出加速异常节点
speedD.to_excel('C:\\Users\\lijun78\Desktop\\D题\\speedD.xlsx') #输出减速异常节点

目前的代码如下:


import numpy as np
import pandas as pd
import datetime
import copy
data1 = pd.read_excel('D:\\Project_Encyclopedia\\2019年中国研究生数学建模竞赛赛题\\2019年中国研究生数学建模竞赛D题\\原始数据\\文件1.xlsx')  #原始数据
data1 = pd.DataFrame(data1)#DataFrame的单元格可以存放数值、字符串
data1 = np.array(data1)#转化为数值型
data1_out=copy.deepcopy(data1) #原始数据副本(记录处理后最终数据)
time_inc=[] #时间不连续节点
#寻找断续时间节点
for i in range(data1.shape[0]-1): #data1.shape[0]-1是数据的行数
    date1=datetime.datetime.strptime(data1[i][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    #datetime.datetime.strptime:万能的日期格式转换
    #data1[i][0]对应日期那一列
    date2=datetime.datetime.strptime(data1[i+1][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    ss=(date2-date1).seconds
    if ss!=1:
        time_inc+=[[i,ss]]
time_inc=np.array(time_inc)
time_inc=time_inc+np.array([1,0]*time_inc.shape[0]).reshape([time_inc.shape[0],2])
time_inc=pd.DataFrame(time_inc)
time_inc.to_excel('D:\\Project_Encyclopedia\\2019年中国研究生数学建模竞赛赛题\\2019年中国研究生数学建模竞赛D题\\原始数据\\time_inc.xlsx') #输出断续时间节点
#缺失数据补充(仅补充间隔 1 秒)
ff1=[] #过渡列表,给原始数据补充 1 秒缺失数据
i=0
j=data1_out.shape[0]-1 #跟踪待补充数据表维度
data1_out=data1_out.tolist() #向量转列表
while(i<j):
    date3=datetime.datetime.strptime(data1_out[i][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    date4=datetime.datetime.strptime(data1_out[i+1][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    ss=(date4-date3).seconds
    if ss==2:
        ff1=[(date3+datetime.timedelta(seconds=1)).strftime('%Y/%m/%d %H:%M:%S')] #在date3的基础上增加1s
        ff1=ff1+(1/2*(np.array(data1_out[i+1][1:])+np.array(data1_out[i][1:]))).tolist()
        data1_out.insert(i+1,ff1)
        j=j+1
    i=i+1
speedU=[]            #加速不合要求 Vup>100/7
speedD=[]            #减速不合要求 Vdn>28.8
#新数据中寻找加减速异常数据
for i in range(len(data1_out)-1):
    date5 =datetime.datetime.strptime(data1_out[i][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    date6 =datetime.datetime.strptime(data1_out[i+1][0].replace('.000.',''),'%Y/%m/%d %H:%M:%S')
    ss=(date6-date5).seconds
    if (data1_out[i+1][1]-data1_out[i][1])/ss>100/7:
        speedU.append(i+1)
    if (data1_out[i][1]-data1_out[i+1][1])/ss>28.8:
        speedD.append(i+1)
data1_out=np.array(data1_out)
#剔除异常数据
data1_out=np.delete(data1_out,speedU,axis=0)
data1_out=np.delete(data1_out,speedD,axis=0)
#数据导出,加减速异常数据节点
speedU=np.array(speedU)
speedD=np.array(speedD)
speedU=speedU+np.ones([1,speedU.shape[0]])#python是从0索引开始的 所以+1
speedD=speedD+np.ones([1,speedD.shape[0]])
speedU=pd.DataFrame(speedU.T)
speedD=pd.DataFrame(speedD.T)
speedU.to_excel('D:\\Project_Encyclopedia\\2019年中国研究生数学建模竞赛赛题\\2019年中国研究生数学建模竞赛D题\\原始数据\\speedU.xlsx') #输出加速异常节点
speedD.to_excel('D:\\Project_Encyclopedia\\2019年中国研究生数学建模竞赛赛题\\2019年中国研究生数学建模竞赛D题\\原始数据\\speedD.xlsx') #输出减速异常节点

image


posted @ 2022-05-09 10:46  司砚章  阅读(219)  评论(0编辑  收藏  举报