matlab 如何使用Python将变量从.mat文件(由Dymola生成)导出为.csv

1u4esq0p  于 2022-11-15  发布在  Matlab
关注(0)|答案(3)|浏览(196)

我是一名学生,对用Python编写代码非常陌生。我使用Dymola已经有几年了,现在我使用的是Dymola/Python接口,您可以通过该接口从Python内部操作Dymola(用于构建股票模拟、全局敏感度分析等)。
现在,Dymola总是以一种高效的不可读的数据结构生成.mat文件。我想知道如何使用Python脚本将我感兴趣的变量从.mat文件导出到.csv?(我不希望将整个文件转换为.csv,因为它太大了。)
我知道一个DyMat-Package for Python应该可以完成这项工作,但要么是我不理解代码,要么是代码没有做它应该做的事情?有谁有这方面的经验吗?我可能遗漏了一些代码,这些代码定义了必须从哪个.mat文件中读取/导出、我想要哪些变量以及Result.csv文件应该存储在哪个目录中?

import csv, numpy

def export(dm, varList, fileName=None, formatOptions={}):
    """Export DyMat data to a CSV file"""

    if not fileName:
        fileName = dm.fileName + '.csv'
    oFile = open(fileName, 'w')
    csvWriter = csv.writer(oFile)

    vDict = dm.sortByBlocks(varList)
    for vList in vDict.values():
        vData = dm.getVarArray(vList)
        vList.insert(0, dm._absc[0])
        csvWriter.writerow(vList)
        csvWriter.writerows(numpy.transpose(vData))

    oFile.close()

谢谢!

k5hmc34c

k5hmc34c1#

在Dymola发行版中,有一个名为alist.exe的实用程序,它允许您以CSV格式导出许多变量。
另一种可能是将MAT文件转换为SDF格式,这是一种非常简单的HDF5解释。HDF5文件不如MAT文件紧凑,但您可以使用ZIP/GZIP/7ZIP压缩文件以减少归档存储。在Dymola发行版中,有用于读取SDF格式的MATLAB和Python脚本。

mlmc2os5

mlmc2os52#

由于它被标记为openmodelica,因此我提出了一个使用它的解决方案:
FilterSimulationResults(“file.mat”,“file.csv”,{“x”,“y”,“z”})创建一个只包含变量x,y,z的CSV文件(如果您认为它仍然太大,可以对文件重新采样)。

vm0i2vca

vm0i2vca3#

对于小文件(<2 GB),Buildingspy(或其他Python包)几乎可以满足所有需求:https://simulationresearch.lbl.gov/modelica/buildingspy/
然而,由于当文件大于2 GB时会遇到问题(例如,对于全年的模拟),可能会使用Dymola的“alist.exe”。(OpenModelica的filterSimulationResults也会失败)
“alist.exe”似乎直到大约。一次导出100个变量,对每个变量执行一次似乎会大大减慢速度(翻译1或100行的时间几乎相同)。您可以使用如下所示的来自Python的alist.exe来促进自动化和加快速度。

var_list=['Component.Name1','Component.Name3','Component.Name2','...'] #List of Variabels to be extracted
N_batch=100 #Number of variables to be extracted from the .mat file at once (max. approx 110)

cmds=[]        #list of commands to be executed batch wise 

for i,var in enumerate(var_list):
    if (i%N_batch == 0) &(i > 0):
        cmds.append(cmd)
        cmd=''
    cmd+=f' -e {var}'#build command
    
cmds.append(cmd)

lst_df=[]       #list of pandas dataframes 
for i,cmd in enumerate(cmds):
    os.system(f'"C:/Program Files/Dymola 2021/bin64/alist.exe" {cmd} {inFile} tmp.csv')
    lst_df.append(pd.read_csv('tmp.csv',index_col=[0]).squeeze("columns"))

df_overall=pd.concat(lst_df,axis=1)
df_overall.to_csv('CompleteCSVFile.csv')#or use .pkl for more efficient writing and reading

这仍然不是一个快速的解决方案,但可以首先处理日期。在尝试在本地计算机上处理如此大量的数据之前,始终应该首先利用Dymola的变量选择。
希望有一天这能帮助到别人!

相关问题