作为一名数模选手,在做题的时候画一些海岸线图、地形图、气象图等有时候是非常必要的,而且对于美赛而言,好看的图片是很重要的加分项。很多时候,气象、生态、海洋等相关数据导入文件格式是.nc文件。之前有一次数模训练,第一次下载的nc文件不知道怎么打开和读取出来,花了好长时间,走了很多弯路,现在把经验总结一下。

一、关于.nc文件

NC文件全称是Network Common Data Format,也叫做NetCDF文件,即网络通用数据格式,这种文件格式一开始是专门用于气象学数据的存储,现在已经发展演变为很多数据采集软件的文件生成格式了。

我所接触过的nc文件的构成大致是将一种数据的各个纬度按照标签独立地存储起来,比如海洋表面温度数据的nc文件,主要包含四个数据标签:海洋表面温度、经度、纬度和时间。数据的维度没有限制,甚至可以是多维矩阵。除此之外,nc文件还可以包含一些其他内容,主要是一些关于数据的注释说明,例如数据的来源、数据类型、数据的属性以及获取数据并公布出来的机构名等,这些说明使得数据更具有严谨性和权威性。

将nc数据导入matlab后看到的变量情况

二、nc文件的读取和导入—Matlab

作为一个一开始四处碰壁不知道怎么读取nc文件内容的人,我尝试过使用Excel的插件NetCDF4Excell来读取,可是下载后发现是32位的插件,要想在64位电脑使用的话要改一点底层代码,改倒是容易,可是人家底层代码文件是仅可读。后来查阅资料千辛万苦改了,可是又出了一个bug,好像无法解决,遂放弃。后来又去用python读取,可能是pip未更新,也可能是镜像不好,库文件NetCDF4就是无法安装成功,即使我想将就用把版本降到了很低也不行。芜湖~

最终我还是用matlab轻松读取并导入了nc文件。

matlab有专门读取nc文件的函数ncread,其使用格式为:

vardata = ncread(source,varname)
vardata = ncread(source,varname,start,count)
vardata = ncread(source,varname,start,count,stride)

第一个参数source很好理解,就是你的nc文件名(在单引号里面以.nc结尾),例如:‘sst.wkmean.1990-present.nc’

一开始,其中最让我不解的是第二个参数,就是nc文件中包含的变量名之一,你想把哪个参数读取出来就输入这个参数名。例如上面海洋表面温度文件中的‘sst’或者‘time’等,可是,你就是想要知道这个nc文件里面有什么东西,你不可能事先就知道nc文件里的变量有哪些再去看变量是什么。我小小的脑袋有大大的疑惑。

所以我又找到了第二个函数ncinfo,其使用格式为:

finfo = ncinfo(source)
vinfo = ncinfo(source,varname)
ginfo = ncinfo(source,groupname)

其实它最简单的调用方法也是最实用的,就是直接

M = ncinfo('文件名.nc');

这样就会将你文件名所指定的nc文件数据源的全部相关信息,以结构体的形式存储在变量M中,所以M是一个struct类型变量。

当你打开工作区中的M变量,就会得到下面的结果(比如以我的文件为例):

nc文件转为结构体

那么此时这个nc文件的内容很清晰明了,从上到下依次是:文件名(Filename)(其实是文件路径)、名字(Name)(这个事文件标签,我这个文件没有)、维度(Dimensions)(这个是nc文件中包含的所有变量的维度,例如:海洋表面温度变量有三个维度:经度(0~360)、纬度(-90~90)和时间(12个月),对应这个数据是一个三维矩阵[360][180][12])、变量(Variables)(所有的变量列表,比如时间、经度、纬度、海洋表面温度)、属性(Attributes)(数据的注释和说明)、组(Groups)、函数(Format)

属性(Attributes)

此时你只需要点开变量(Variables)查看文件中包含哪些变量,就可以用ncread将其读取出来,也可以保存在一个矩阵里

变量列表

我们再回到函数ncread

vardata = ncread(source,varname)
vardata = ncread(source,varname,start,count)
vardata = ncread(source,varname,start,count,stride)

其中,第三个参数为start,可以是一个值也可以是一个列表,例如:

start = [12 10 19];表示你想读取的这个变量是一个三维矩阵,第一个维度你想从序号12开始读取,第二个维度你想从10开始读取,第三个同理。

第四个参数为count,可以是一个值也可以是一个列表,例如:

count = [10 2 11];表示你读取这个三维变量的时候,第一个维度从start指定的起始序号(12)开始,再读取10个变量、第二个维度从start指定的起始序号(10)开始,再读取2个变量,第三个同理。

最后第五个参数为stride,可以是一个值也可以是一个列表,例如:

stride = [1 2 1];表示你读取第一个维度的时候,变量序号之间相隔1(就是正常从头往后读取),第二个维度的时候,变量序号之间相隔2(就是隔一个读一个),第三个同理。

到这里,matlab读取nc文件就完成啦

三、nc文件转csv文件

其实学会读取nc文件,转化为csv文件就很简单了。

只需要使用csvwrite这个函数,其使用格式如下:

csvwrite(filename,M)

filename就是你想保存的csv文件,单引号括起来,例如‘data.csv’这样不写路径就会保存到matlab代码文件所在的文件夹。

也可以写路径,就可以更加灵活地保存。

讲到这里多记一点点,读取csv文件使用函数csvread

M = csvread(filename)

这样就可以把csv文件中的行和列分别存储到矩阵变量M的行和列中

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐