Matlab的mat格式數據轉化至python數據格式


因工作原因,一些獲取的行業數據以已知的結構體存儲在.mat文件中,

現需要將其存儲在數據庫中並且能夠靈活調用至python dataframe里進行操作

 

原數據的一個例子如下

目標如上:

然后是轉化代碼:

import scipy.io
data = scipy.io.loadmat(r'C:\Users\wenzhe.tian\Desktop\PTSimA\Doing\MC.mat')
import pandas as pd


data.pop('__header__')
data.pop('__version__')
data.pop('__globals__')
vehicle_name=data.keys()
vehicle_name=list(vehicle_name)

for i in vehicle_name:
    df = pd.DataFrame(data[i][0])
    try:
        df=df.astype(float)
    except:
        for j in list(df):
            try:
                df[j]=df[j].astype(float)
            except:
                continue
#                df[j]=df[j].astype(str)
    if i==vehicle_name[0]:
        df1=df;
    else:
        df1=pd.concat([df,df1],axis=0)

df1['MC_name']=vehicle_name
df1['Tips']=df1['Tips'].map(str)+df1['tips'].map(str)
df1['Tips']=df1['Tips'].str.replace('nan','')
df1=df1.drop(['tips'],axis=1)
df1=df1.reset_index();

import numpy as np
# ndarray需轉化為 字符
list_transfer=['Speed','Torque','eff','eff_current']
for i in list_transfer:
    for j in range(len(df1)):
        try:
            df1[i][j]=df1[i][j].tostring();
        except:
            continue;
View Code

結果如下(df1):

然后用to_sql的方式將該dataframe 保存至本地sql數據庫即可

 一個難點是遇到struct結構體中包含mat的矩陣格式時,如下圖:

 

所有參數為一個struct,但是data與acc作為結構體的一個單位,其數據是一個矩陣而非單個數值。因此需要繼續處理:

data = scipy.io.loadmat(r'C:\Users\ext.wenzhe.tian\Desktop\PTSimA\Doing\CYCLE.mat',
                        mat_dtype=True,struct_as_record=True)#variable_names='CATC'
data.pop('__header__')
data.pop('__version__')
data.pop('__globals__')

name=data.keys()
name=list(name)
ans_name={}

for i in name:
    df = pd.DataFrame(data[i][0])
    try:
        df=df.astype(float)
    except:
        for j in list(df):
            try:
                df[j]=df[j].astype(float)
                df[j]=df[j].apply(lambda x:x[0][0])
            except:
                continue

    if i==name[0]:
        df1=df;
    else:
        df1=pd.concat([df,df1],axis=0)
    
    ans_name[i]=pd.DataFrame(columns=['time[s]','veh_spd[km/h]','acc[m/s]'],
            data={'time[s]':list(data[i][0,0]['data'][:,0]),
                  'veh_spd[km/h]':list(data[i][0,0]['data'][:,1]),
                  'acc[m/s]':list(data[i][0,0]['acc'][:,1])})

ans_name即針對其中的矩陣單獨定義一個dataframe,再從導入的data數據中提取寫入。結果除以上的dataframe外,還有另一個dataframe:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM