Python新手求助:将.mat文件转换为DataFrame的方法
解决NASA电池.mat文件转DataFrame的问题
问题根源
你之前的代码错误在于直接访问mat['Voltage_measured'],但这个.mat文件的结构是嵌套的:顶层键是电池编号(如'B0005'),所有测量数据都嵌套在cycles数组的每个循环条目里,并非顶层直接存在Voltage_measured这类键。
完整解决方案代码
import pandas as pd import scipy.io as sio # 读取.mat文件 mat = sio.loadmat('B0005.mat') # 提取电池核心数据(顶层键为电池编号) battery_core = mat['B0005'][0, 0] # 获取所有循环的数据集 cycles = battery_core['cycles'] # 初始化列表存储所有时间点的测量数据 all_records = [] # 遍历每个循环 for idx in range(cycles.shape[0]): current_cycle = cycles[idx, 0] # 获取当前循环编号 cycle_num = current_cycle['cycle'][0, 0] # 提取各测量数据,将二维数组转为一维(flatten()) voltage = current_cycle['Voltage_measured'][0, 0].flatten() current_measured = current_cycle['Current_measured'][0, 0].flatten() temperature = current_cycle['Temperature_measured'][0, 0].flatten() current_load = current_cycle['Current_load'][0, 0].flatten() time = current_cycle['Time'][0, 0].flatten() # 将每个时间点的多维度数据整合为字典,加入列表 for v, c, t, cl, tm in zip(voltage, current_measured, temperature, current_load, time): all_records.append({ 'cycle_number': cycle_num, 'time': tm, 'Voltage_measured': v, 'Current_measured': c, 'Temperature_measured': t, 'Current_load': cl }) # 转换为DataFrame df = pd.DataFrame(all_records) # 查看前5行数据 print(df.head())
提取单个循环的数据(可选)
如果只需要某一个循环的数据集,比如第10个循环(索引从0开始,对应idx=9):
target_cycle = cycles[9, 0] single_cycle_df = pd.DataFrame({ 'Voltage_measured': target_cycle['Voltage_measured'][0,0].flatten(), 'Current_measured': target_cycle['Current_measured'][0,0].flatten(), 'Temperature_measured': target_cycle['Temperature_measured'][0,0].flatten(), 'Current_load': target_cycle['Current_load'][0,0].flatten(), 'Time': target_cycle['Time'][0,0].flatten() }) print(single_cycle_df.head())
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

