将具有嵌套结构的 MATLAB 文件转换为数据帧字典
Posted
技术标签:
【中文标题】将具有嵌套结构的 MATLAB 文件转换为数据帧字典【英文标题】:Convert MATLAB file with Nested Structures into a dictionary of dataframes 【发布时间】:2021-01-11 14:14:07 【问题描述】:我有一个包含嵌套结构的 MATLAB 文件,如下图所示。当我打开文件时,它显示 (1,616) struct.... 616 个字段中的每一个在另一个 (1,1) 结构中都有数据。每个 (1,1) 结构都有 6 个形状参数值 (1,789)。
d = sio.loadmat('file_name.mat')
del d['__header__']
del d['__version__']
del d['__globals__']
d
使用 python 加载数据时,显示为带有一个键(循环)的字典,其中 ndarray 作为值。我想将每个具有 6 个参数的结构(总共 616 个)转换为一个数据帧,并将所有 616 个数据帧存储在一个字典中,以便以后可以将该字典转换为 Excel 工作簿。我尝试使用以下代码为一个结构做,并得到如下代码所示的输出(根据需要)
list1 = d['cycle']['data'].item(0).item(0)
df1 = pd.DataFrame(np.concatenate(list1))
df1 = df1.transpose()
df1.columns = ["Voltage","Current", "Temperature","Current_charger","Voltage_charger","Time"]
df1
Voltage Current Temperature Current_charger Voltage_charger Time
0 3.873017 -0.001201 24.655358 0.000 0.003 0.000
1 3.479394 -4.030268 24.666480 -4.036 1.570 2.532
2 4.000588 1.512731 24.675394 1.500 4.726 5.500
3 4.012395 1.509063 24.693865 1.500 4.742 8.344
4 4.019708 1.511318 24.705069 1.500 4.753 11.125
... ... ... ... ... ... ...
784 4.190822 -0.003391 24.539397 0.000 0.003 7525.782
785 4.191299 -0.000942 24.532498 0.000 0.003 7543.797
786 4.191388 -0.000351 24.518673 0.000 0.003 7561.750
787 4.191453 -0.001856 24.514363 0.000 0.003 7579.813
788 4.191078 -0.002892 24.507040 0.000 0.003 7597.875
789 rows × 6 columns
我已经为一个结构完成了它。但我无法编写代码使其在所有 616 个周期中重复。请帮我解决这个问题。
谢谢
【问题讨论】:
【参考方案1】:如果我没听错的话,您只需提取 B0005.cycle(1).data
中 6 个字段的字段名。
如果它们在整个结构中的名称都相同,则任务几乎完成 - 您只需在 for 循环中针对不同的 .data
-fields 重复您的 python 代码。
如果字段名称不同,您需要先使用 MATLAB 命令读取它们
fldnames = fieldnames(B0005.cycle(1).data);
然后您可以将它们保存在一个文本文件中,并在您的 python 脚本中读取/加载它。然后您可以继续使用已有的代码。
【讨论】:
很抱歉回复很晚......我有一段时间没有处理这个问题,因此没有检查您的回复。是的。你说的对。我需要从每个周期中提取 6 个字段。但是每个循环中的字段名称并不相同。 “充电”、“放电”、“阻抗”是 3 个周期名称。它们中的每一个都有不同的参数作为它们内部的字段名称。我是python的初学者。我无法理解你的解释。如果您能详细说明,那就太好了。等待你的回复。谢谢:) @Stefan G. 好的,我的想法是在 MATLAB 中为每个结构提取 6 个字段名称并将它们保存在文本文件中。然后你可以在你的 python 脚本中读取这个文本文件,在这里你把你已经拥有的代码行放在一个 for 循环中,以便循环每个字段。然后你不会硬编码df1.columns = [...]
(就像你上面所做的那样),而是从每个循环中的文本文件中动态读取相应的字段名并将其分配给df1.columns
。另一个想法是在 MATLAB 中完成整个任务——如果你愿意的话。 :)以上是关于将具有嵌套结构的 MATLAB 文件转换为数据帧字典的主要内容,如果未能解决你的问题,请参考以下文章