在学习python过程中,有时需要来自于matlab的数据,需要从mat文件提取数据并转换为python可以使用的数据。下面通过实例来介绍操作过程。
本文的代码来自:NASA 锂电池数据集,基于 Python 的锂电池寿命预测(Remaining Useful Life,RUL)& (End Of Life,EOF) - 倔强的小蜗牛
# 加载 mat 文件
def loadMat(matfile):
data = scipy.io.loadmat(matfile)
filename = matfile.split('/')[-1].split('.')[0]#先分隔并取出最后一个元素,即B0005.mat,然后再分隔取出B0005
col = data[filename]
col = col[0][0][0][0]
size = col.shape[0]#获取数据的行数616
data = []
for i in range(size):
k = list(col[i][3][0].dtype.fields.keys())#.dtype.fields ,它返回一个字典;.keys() 方法则用于获取这个字典的所有键,即结构化数组中的字段名。
d1, d2 = {}, {}#建立空字典
if str(col[i][0][0]) != 'impedance':
for j in range(len(k)):
t = col[i][3][0][0][j][0];#得到键值的具体数据集
l = [t[m] for m in range(len(t))]
d2[k[j]] = l#将数据存入d2中
d1['type'], d1['temp'], d1['time'], d1['data'] = str(col[i][0][0]), int(col[i][1][0]), str(convert_to_time(col[i][2][0])), d2
data.append(d1)
return data
data = scipy.io.loadmat(matfile):
在这一步中,得到的信息可以理解为字典:
解析得到的matlab文件中不仅包含数据,有:
__header__
:通常包含MATLAB文件的头部信息,如创建文件时使用的MATLAB版本、平台信息和创建日期等。__version__
:MATLAB文件格式的版本号。__globals__
:在MATLAB全局工作区中存在的变量列表,若无全局变量则为空列表。'B0005'
:MATLAB文件中存储的实际数据变量名,也就是说,文件中最重要的数据部分很可能位于这个键对应的值中。
通过split()分割,得到B0005,选择data中‘B0005’信息。
下面介绍col[0][0][0][0]以及col[i][3][0][0][j][0]:
col[0][0][0][0]:
开始,col = data[‘B0005’]:
col[0][0]得到:
再进行一次col[0][0],即col = col[0][0][0][0]得到:
成功进入了该页面。这里说明一下,matlab内部存储的字段视作二维字段,即使只有一个元素。所以要想获取里面的内容,都需要[0][0],可以把它当做进入内部的钥匙,当然,不一定是[0][0],可以是[1][0],后文将提到。
col[i][3][0][0][j][0]:
进入上方页面后,col[i][3]表示选择第(i+1)行第4列(data列)。
col[i][3][0][0]进入内部,如下图:
接下来,col[i][3][0][0][j][0],进入下一层。
接下来就可以对具体的数据进行操作了。