爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: Aires

[程序设计] Matlab读取nc文件常用命令总结

  [复制链接]

新浪微博达人勋

发表于 2017-7-11 17:03:03 | 显示全部楼层
Aires 发表于 2017-7-11 15:40
你查看一下filelist是否正确,我感觉你PM2.5这个文件夹下都是nc文件吧,是不是应该是
datadir = 'E:.... ...

我这个文件夹下就1个nc文件,就我写出来的那个,前面都是能正确读取,并且那个nc文件里面的变量什么的都会正确显示,但是读取time,lon ,lat这几行就那样报错,不知道为什么。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-11 17:30:31 | 显示全部楼层
WENXING 发表于 2017-7-11 17:03
我这个文件夹下就1个nc文件,就我写出来的那个,前面都是能正确读取,并且那个nc文件里面的变量什么的都 ...

我不知道你文件夹下就一个文件用dir函数有什么意义。你试试ncread('文件名‘,’lon')。直接写文件名试试。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-7-12 17:00:15 | 显示全部楼层
lon=[];lon=ncread(filename1,'longitude');
lat=[];lat=ncread(filename1,'latitude');
time1=[];time1=ncread(filename1,'time')
a=[];a=find(lon>=120 & lon<=180);
b=[];b=find(lat>=-30 & lat<=30);    % a和b作为经度和纬度的指针
t=[];t=time1(2:6);
lon_num=[];lon_num=length(a);
lat_num=[];lat_num=length(b);
t_num=[];t_num=length(t);
BB=[];BB=ncread(filename1,'u10',[a(1) b(1) t(1)],[lon_num lat_num t_num]);


我读取的数据多了一维时间的,为31行1列,为什么这么写会出错?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-7-12 17:54:05 | 显示全部楼层
楼主,我的程序是这样的,ncid = netcdf.open('C:\Users\509\Downloads\sst.mon.1981-2010.ltm.v4.nc');
ncdisp('C:\Users\509\Downloads\sst.mon.1981-2010.ltm.v4.nc')
tdata=ncread('C:\Users\509\Downloads\sst.mon.1981-2010.ltm.v4.nc','time');
然后很奇怪,读出的时间是十二个很奇怪的数字而且是负数,按理说时间应该是每一年的12月,请问这是怎么回事啊?求教,
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-12 18:16:51 | 显示全部楼层
初雪初心 发表于 2017-7-12 17:54
楼主,我的程序是这样的,ncid = netcdf.open('C:%users\509\Downloads\sst.mon.1981-2010.ltm.v4.nc');
n ...

我不清楚它时间是怎么计算的。模式或者数据记录的时候时间是有一定的存储方式的。我觉得你没有必要读取时间信息,只读取数据和经纬度数据就可以了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-12 18:18:32 | 显示全部楼层
yinger 发表于 2017-7-12 17:00
lon=[];lon=ncread(filename1,'longitude');
lat=[];lat=ncread(filename1,'latitude');
time1=[];time1= ...

你看看你t(1)是什么,是不是第几个时间,我怀疑是不正确的信息。所以建议你时间维度自己计算后再自己写进去,不要用t(1)来写。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-7-13 09:00:12 | 显示全部楼层
数据读出的信息如下:
Source:
           F:\全部数据\读nc数据\nc\_grib2netcdf-atls00-a562cefde8a29a7288fa0b8b7f9413f7-H5cayW.nc
Format:
           64bit
Global Attributes:
           Conventions = 'CF-1.6'
           history     = '2017-07-10 10:04:40 GMT by grib_to_netcdf-2.4.0: grib_to_netcdf /data/data02/scratch/_mars-atls01-98f536083ae965b31b0d04811be6f4c6-QbLc6B.grib -o /data/data04/scratch/_grib2netcdf-atls00-a562cefde8a29a7288fa0b8b7f9413f7-H5cayW.nc -utime'
Dimensions:
           longitude = 2880
           latitude  = 1441
           time      = 31    (UNLIMITED)
Variables:
    longitude
           Size:       2880x1
           Dimensions: longitude
           Datatype:   single
           Attributes:
                       units     = 'degrees_east'
                       long_name = 'longitude'
    latitude
           Size:       1441x1
           Dimensions: latitude
           Datatype:   single
           Attributes:
                       units     = 'degrees_north'
                       long_name = 'latitude'
    time     
           Size:       31x1
           Dimensions: time
           Datatype:   int32
           Attributes:
                       units     = 'hours since 1900-01-01 00:00:0.0'
                       long_name = 'time'
                       calendar  = 'gregorian'
    u10      
           Size:       2880x1441x31
           Dimensions: longitude,latitude,time
           Datatype:   int16
           Attributes:
                       scale_factor  = 0.00089
                       add_offset    = -1.64
                       _FillValue    = -3.28e+04
                       missing_value = -3.28e+04
                       units         = 'm s**-1'
                       long_name     = '10 metre U wind component'

其中 time 输出如下:
     1008087
     1008111
     1008135
     1008159
     1008183
     1008207
     1008231
     1008255
     1008279
     1008303
     1008327
     1008351
     1008375
     1008399
     1008423
     1008447
     1008471
     1008495
     1008519
     1008543
     1008567
     1008591
     1008615
     1008639
     1008663
     1008687
     1008711
     1008735
     1008759
     1008783
     1008807

编写程序提取部分数据:
lon=[];lon=ncread(filename1,'longitude');
lat=[];lat=ncread(filename1,'latitude');
time1=[];time1=ncread(filename1,'time');
a=[];a=find(lon>=120 & lon<=180);
b=[];b=find(lat>=-30 & lat<=30);    % a和b作为经度和纬度的指针
t=[];t=time1(1);
lon_num=[];lon_num=length(a);
lat_num=[];lat_num=length(b);
t_num=[];t_num=length(t);
B=[];B=ncread(filename1,'u10',[a(1) b(1) t(1)],[lon_num lat_num t_num]);

关于time总是出错,麻烦帮看看问题在哪里

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-13 10:26:42 | 显示全部楼层
yinger 发表于 2017-7-13 09:00
数据读出的信息如下:
Source:
           F:\全部数据\读nc数据\nc\_grib2netcdf-atls00-a562cefde8a29a ...

你t(1)返回的还是具体的时间。ncread里面读取数据开始是按第几个数读的,不是具体的经纬度和时间信息。你看看你a(1)和b(1)是什么就知道你为什么t(1)不对了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-7-13 11:50:53 | 显示全部楼层
谢谢楼主的分享。可是netcdf工具包下载那里我不知道从哪里下,,,楼主可以指点一下吗。。打开了您发的链接但是找不到从哪里点击下载。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-13 13:31:51 | 显示全部楼层
潘潘潘昔年 发表于 2017-7-13 11:50
谢谢楼主的分享。可是netcdf工具包下载那里我不知道从哪里下,,,楼主可以指点一下吗。。打开了您发的链接 ...

我建议使用matlab官网自带的netcdf工具箱,不用自己下载。自带的nc函数使用起来都非常方便的。我记得可能是12以上的版本都自带吧,你可以下载个最新的matlab版本。详见Matlab版块里面置顶的帖子,有关于下载最新Matlab版本的帖子。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表