爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 87349|回复: 202

[程序设计] Matlab批量读取nc数据、hdf数据

  [复制链接]

新浪微博达人勋

发表于 2012-10-23 22:48:13 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 wlzhongouc 于 2013-11-30 15:18 编辑
以下无限制可见部分为管理员注
非常感谢猛牛的分享,也许你的积分还不够看到下面的具体内容,请理解作者文字和论坛大环境的来之不易,习惯于索取的人太多,如果你不是一个过客,你常来支持论坛,1000积分不是个很大的数字,如果你只是个过客,我们也只能对您说,我们的有些帖子不是为过客准备的,谢谢您的支持~论坛的发展需要大家的分享!
[
批量读取nc格式的数据(针对不同日期的数据)示例:
for year=2003:2012
     for month=1:12
           mon=num2str(month+100);
          strmon=mon(2:3);
         % To Judge How many days in a month
          if (month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)
              day=31;
          elseif (month==4)||(month==6)||(month==9)||(month==11)
              day=30;
          elseif (mod(year,400)==0||mod(year,4)==0 && mod(year,100)~=0) && (month==2)
              day=29;
          else
              day=28;
          end
        for id=1:day
            mday=num2str(id+100);
            strday=mday(2:3);
            name=[F:\**,num2str(year),num2str(strmon),num2str(strday),'.nc'];  %按时间变化的不同数据
            out=netcdf.open(name,'nc_nowrite');
            temp=netcdf.getvar(out,要导入的变量);
            lat=netcdf.getvar(out,纬度);
            lon=netcdf.getvar(out,经度);
            ......(以下自己设计吧,如作图什么的)
         end
      end
end

-----------------------------------------------------------------------------------------------------------------------------------------------------

批量读取hdf格式的数据示例:
for year=2003:2012
     for month=1:12
          for day=1:31
               filename=[**,[num2str(i),num2str(month,'%.2d'),num2str(day,'%.2d')],'.hdf'];
               if exist(filename,'file')
                  fileinfo=hdfinfo(filename);
                  data=hdfread(fileinfo.SDS);
                  ......(以下写你的程序啦)
               else
                    continue
               end
            end
      end
end


@Aires

评分

参与人数 3金钱 +40 贡献 +9 收起 理由
易小凯 + 10 + 4
Aires + 20 + 2
mofangbao + 10 + 3

查看全部评分

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

新浪微博达人勋

发表于 2013-1-17 03:49:39 | 显示全部楼层
这个读取的方法是对一个文件中的多年数据吧?感觉批量的读取不太一致。
  1. clc;  %清屏
  2. clear; %清空
  3. datadir='D:\data\降水数据\CPC Unified Gauge-Based Analysis of Daily Precipitation over CONUS\'; %指定批量数据所在的文件夹
  4. filelist=dir([datadir,'*.nc']); %指定批量数据的类型
  5. a=filelist(1).name; %查看你要读取的文件的编号。filelist(1).name在window下为第一个标号数据
  6. b=filelist(2).name; %查看你要读取的文件的编号。filelist(2).name在window下为第二个标号数据
  7. k=length(filelist);
  8. for s=1:k
  9.   filename=[datadir,filelist(s).name];
  10.   ncid=netcdf.open(filename,'NC_NOWRITE');
  11.   ncdisp('D:\data\降水数据\CPC Unified Gauge-Based Analysis of Daily Precipitation over CONUS\precip.V1.0.1948.nc'); %在命令窗中显示nc文件的变量
  12.   %任意取其中一个来看数据中所包含的变量特征,以为下面读取数据变量做铺垫
  13.   % ncid = netcdf.open('D:\data\降水数据\CPC Unified Gauge-Based Analysis of Daily Precipitation over CONUS\precip.V1.0.1948.nc','NOWRITE'); %打开nc文件
  14.   % ncdisp('D:\data\降水数据\CPC Unified Gauge-Based Analysis of Daily Precipitation over CONUS\precip.V1.0.1948.nc'); %在命令窗中显示nc文件的变量
  15.   PrecipData  = ncread(filename,'precip'); %读入变量precip
  16.   TimeData  = ncread(filename,'time'); %读入变量time
  17.   LonData  = ncread(filename,'lon'); %读入变量lon
  18.   LatData  = ncread(filename,'lat'); %读入变量lat
  19.   netcdf.close(ncid);   % 关闭文件
  20. end;
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 6 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2012-10-24 09:01:30 | 显示全部楼层

这么设置后我又感觉很别扭,这么设置是因为一想到总有些人不劳而获,不愿意自己多尝试多努力,拿来别人的就直接用,只会索取不会分享,于是我就。。。可能是自己变得太世故了。。。国内各个研究机构之间的交流很多时候就是基于一种“交换式”的合作。。。(看法若有不妥,还请清风批评指正啊)
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-10-24 08:43:24 | 显示全部楼层
哈哈 楼主这个限制的方法第一次有人用啊,不错啦~鼓励大家更多的分享才能得到更好的东东~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-10-24 09:24:07 | 显示全部楼层
wlzhongouc 发表于 2012-10-24 09:01
这么设置后我又感觉很别扭,这么设置是因为一想到总有些人不劳而获,不愿意自己多尝试多努力,拿来别人的 ...

木有关系,把握好度就行拉,你免费分享的东西也很多了~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-24 09:55:58 | 显示全部楼层
支持“交换式”的合作。。。要是早看到就好了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-24 18:37:17 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-24 19:19:28 | 显示全部楼层
新人就悲剧了,才三个几分,看不到啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-26 09:44:36 | 显示全部楼层
积分不到1000啊,看不到了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-26 12:14:09 | 显示全部楼层
本帖最后由 ShaG 于 2012-10-26 13:25 编辑

真搞不懂楼主做个限制有什么用处,又不是多NB的东西,再说楼主的MATLAB说不定还是电驴上别人分享给你的

我提供一些自己的经验给看不到的朋友(我自己也看不到,不知道和楼主的是不是一样 — —。)

MATLAB批处理用dir(file_path),头两个路径是空的删掉即可,不熟悉的同志help一下啥都有。

高版本MATLAB读NC资料用ncdisp/ncread,也可以下载mexcdf使用nc_varget就行


再上个简单的例子,求NCEP-NCAR nc数据skin temperature的全球平均值

file_path=dir('T:\DATA\NCEP-NCAR Reanalysis\Skin Temperature (4times daily)');
file_path(1:2)=[];
% PAT: please check the structure and make sure all the path are available
skt=zeros([100 1]);
% pre-allocate memory for variable "skt"
for i=1:size(file_path, 1)
    skt_temp=ncread(file_path(i).name, 'skt');
    skt_ave_temp=permute(sum(sum(skt_temp)), [3 1 2])./(360*180);
    skt=[skt; skt_ave_temp];
end
skt(1:100)=[]; % check the data

HDF也是一样,确定了变量名后用hdfread



评分

参与人数 1金钱 +12 收起 理由
wlzhongouc + 12

查看全部评分

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

新浪微博达人勋

发表于 2012-10-26 14:06:10 | 显示全部楼层
看不到。。。。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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