1. 程式人生 > 其它 >數模-汽車行駛工況構建(2019D-研賽)(研究了一部分)

數模-汽車行駛工況構建(2019D-研賽)(研究了一部分)

取樣時間

上面的採集總時長計算:拿檔案一為例->因為資料總量為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)

經緯度->文章中寫出大致地區

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)

表格資料:

常用引數解析:

  • io :excel 路徑;
import pandas as pd
#定義路徑IO
IO = '檔案1.xlsx'
#讀取excel檔案
sheet = pd.read_excel(io=IO)
#此處由於sheetname預設是0,所以返回第一個表
print(sheet)
#上述列表返回的結果和原表格存在合併單元格的差異

關於更多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')  #原始資料
data1 = pd.DataFrame(data1)#DataFrame的單元格可以存放數值、字串
data1 = np.array(data1)#轉化為數值型

然後建立原始資料副本(記錄處理後最終資料)

data1_out=copy.deepcopy(data1) #原始資料副本(記錄處理後最終資料)

python中copy()和deepcopy()詳解

尋找斷續時間節點

將data1中日期的那一列轉為標準型

找兩行資料之間時間差

接下來就是遍歷輸出斷續時間節點

#尋找斷續時間節點
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') #輸出斷續時間節點

下面是具體程式碼的展示

缺失資料補充(僅補充間隔 1 秒)

python中tolist()命令

datetime.timedelta類介紹

測試程式碼:

最終程式碼

#缺失資料補充(僅補充間隔 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

新資料中尋找加減速異常資料

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') #輸出減速異常節點