scipy 如何使用Python将.mat文件转换为netcdf文件(.nc)?

t1rydlwq  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(634)

我有不同的.mat文件,比如file_1.mat, file_2.mat, ..., file_n.mat,每个file_x.mat中有var1, var2, ..., varn。变量在不同的文件中有相同的名称,但形状不同。但是,它们在同一个.mat文件中的形状是相同的。
我通常用spicy.io.loadmat()documentation here)在Python中加载它们,但我想将它们转换为netcdf,以便稍后在xarray中使用它们,从而加快计算速度。我想你们中的一些人一定在我之前就做了这件事,从Matlab跳到了Python。
有没有内置的函数可以做到这一点?因为我的变量有相同的名称,我认为创建一些东西并不困难,除了我们需要访问不同维度的变量取决于文件。
谢谢你!

7eumitmz

7eumitmz1#

我有一些东西,我想这是我想做的第一步。它真的是我的要求具体。问题是,你需要了解什么是在你的matfile,在构建适当的维度。

def convert_to_nc(num:int, step:str, nn:str):

# nn correspond to a path to access the .mat file and where I want to save my new netcdf file

if nn == 'CANYONB':
    chemin = 'xx/{}.mat'.format(num)
elif nn == 'ESPER':
    chemin = 'xy/{}.mat'.format(num)
elif nn == 'CONTENT':
    chemin = 'yy/{}.mat'.format(num)
matfile = sc.io.loadmat(chemin)   

# CONDITION to choose the variables we want from the .mat file

var = [i for i in matfile[step].dtype.names if 'ci' not in i]

# var = [i for i in var if 'sigma' not in i]

# var = [i for i in var if 'raw' not in i]

# var = [i for i in var if 'cy' not in i]

print(var)

# I will open another netcdf file to look for the corresponding dimensions

ds = xr.open_dataset('my_alreadygoodnetcdf_{}.nc'.format(num))
ds_exit = xr.Dataset()
for name in range(len(var)):
    ds_exit[var[name]] = (("PRES_INTERPOLATED", "N_PROF"), matfile[step][var[name]][0][0])
ds_exit = ds_exit.assign_coords(TIME=("N_PROF", ds['TIME'].values)).assign_coords(LATITUDE=("N_PROF", ds['LATITUDE'].values)).assign_coords(LONGITUDE=("N_PROF", ds['LONGITUDE'].values)).assign_coords(N_PROF=("N_PROF", ds['N_PROF'].values)).assign_coords(PRES_INTERPOLATED=("PRES_INTERPOLATED", ds['PRES_INTERPOLATED'].values))
if nn == 'CANYONB':
    save_path = 'xx/{}.nc'.format(num)
elif nn == 'ESPER':
    save_path = 'xy/{}.nc'.format(num)
elif nn =='CONTENT':
    save_path = 'yy/{}.nc'.format(num)

ds_exit.to_netcdf(save_path)
return ds_exit

运行

convert_to_nc(1901212, 'out', 'CONTENT')

相关问题