MATLAB将多个NETCDF数据合并/MATLAB写NETCDF数据

帮同学写的一个程序,目的是:把很多个NC数据合并在一起,并且每个.nc数据的变量名称是相同,我平常读.nc数据比较多,较少涉及写入。我先使用了IDL但是由于原数据的属性信息也很多,因此最后放弃。而MATLAB有基于现有的数据创建一个模板,对数据进行生成。

代码如下:

1.先对需要的.NC数据进行提取

2.提取所需的数据属性等

3.对数据进行赋值

tic
close all;
clear all;
sy=2005;
ey=2005;
for year=sy:ey
    ncpath=strcat('J:\codeforYu\',num2str(year),'\');
    files = dir([ncpath,'*.nc']);
    len = length(files);
    outfilepath='J:\codeforYu\new\';
    filename=strcat('MERRA2_300.tavg1_2d_flx_Nx.',num2str(year),'.nc4.nc');%MERRA2_300.tavg1_2d_flx_Nx.2005_2005.nc4.nc
    outtmp(576,361,len*4)=0.01; %len*4
    time(len*4)=-1;
    for i = 1:len
        finfo = ncinfo([ncpath,files(i).name]) ;  %'返回有关 NetCDF 数据源的信息'
    %     ncdisp([ncpath,files(i).name])          %'在命令行窗口中显示 NetCDF 数据源内容'
        ncid = netcdf.open([ncpath,files(i).name],'nc_nowrite');  %'打开nc文件,获取文件id'
        varid = netcdf.inqVarID(ncid,'RHOA'); % '获取所需变量的id号 varid'
        p = netcdf.getVar(ncid, varid);
        timetmp= ncread([ncpath,files(i).name],'time');
        if i ==1
            outtmp=p(:,:,0+1);
            time=timetmp(0+1);
%             time=cat(1,time,timetmp(6+1));
%             time=cat(1,time,timetmp(12+1));
%             time=cat(1,time,timetmp(18+1));

        else
%             1440=24*60由于此时我们进行了合并,但是不同文件的时间起始是不同的
            outtmp=cat(3,outtmp,p(:,:,0+1));
            time=cat(1,time,timetmp(0+1)+(i-1)*1440);
            
        end
        outtmp=cat(3,outtmp,p(:,:,6+1));
        outtmp=cat(3,outtmp,p(:,:,12+1));
        outtmp=cat(3,outtmp,p(:,:,18+1));
        time=cat(1,time,timetmp(6+1)+(i-1)*1440);
        time=cat(1,time,timetmp(12+1)+(i-1)*1440);
        time=cat(1,time,timetmp(18+1)+(i-1)*1440);
        
        netcdf.close(ncid) %'关闭文件' 


    end


%    lat的属性信息加载
    myVarSchema = ncinfo([ncpath,files(1).name],'lat');
    ncwriteschema(strcat(outfilepath,filename),myVarSchema);
%     lon的信息加载
    myVarSchema = ncinfo([ncpath,files(1).name],'lon');
    ncwriteschema(strcat(outfilepath,filename),myVarSchema);
%     看一看咋样了
    ncdisp(strcat(outfilepath,filename));
% RHOA属性信息加载
    schema=ncinfo([ncpath,files(1).name],'RHOA');
% 修改一定的信息
    schema.Dimensions(3).Length = len*4;%size(outtmp,3);%len*4
    schema.Size=[576 361 len*4];%len*4
    ncwriteschema(strcat(outfilepath,filename), schema);
%    看一看
%     ncdisp(strcat(outfilepath,filename));
% time的属性信息加载
    timeschema=ncinfo([ncpath,files(1).name],'time');
    timeschema.Dimensions(1).Length = len*4;%size(outtmp,l3);%len*4
    timeschema.Size=len*4;%len*4
    ncwriteschema(strcat(outfilepath,filename), timeschema);
%     看一看
    ncdisp(strcat(outfilepath,filename));
% 将本年第一个文件的lat给它
    ncwrite(strcat(outfilepath,filename),'lat',361);
    latData   = ncread([ncpath,files(1).name],'lat');
    ncwrite(strcat(outfilepath,filename),'lat',latData);

% 将lon给他
    ncwrite(strcat(outfilepath,filename),'lon',576);
    lonData   = ncread([ncpath,files(1).name],'lon');
    ncwrite(strcat(outfilepath,filename),'lon',lonData);
% RHOA的赋值
%     outtmp=double(outtmp);
    ncwrite(strcat(outfilepath,filename),'RHOA',outtmp);
% time的赋值
%     time=int32(time);
    ncwrite(strcat(outfilepath,filename),'time',time);
    disp(['已经完成:' num2str(year) ]);
end

toc

 

合并多个nc文件,可以使用MATLAB中的ncread和ncwrite函数。以下是一个示例代码,演示如何读取多个nc文件,并将它们合并成一个单独的nc文件。 ```matlab % 输入文件名 filename1 = 'file1.nc'; filename2 = 'file2.nc'; filename3 = 'file3.nc'; output_filename = 'merged_file.nc'; % 读取第一个文件变量名和维度信息 vars1 = ncread(filename1, 'var'); dims1 = ncread(filename1, 'dim'); % 创建文件入第一个文件变量和维度信息 ncid = netcdf.create(output_filename, 'NC_WRITE'); for i = 1:length(dims1) dimid(i) = netcdf.defDim(ncid, dims1{i}, length(ncread(filename1, dims1{i}))); end for i = 1:length(vars1) varid(i) = netcdf.defVar(ncid, vars1{i}, 'double', dimid); end netcdf.endDef(ncid); for i = 1:length(vars1) netcdf.putVar(ncid, varid(i), ncread(filename1, vars1{i})); end % 读取并追加第二个和第三个文件变量和维度信息 vars2 = ncread(filename2, 'var'); dims2 = ncread(filename2, 'dim'); vars3 = ncread(filename3, 'var'); dims3 = ncread(filename3, 'dim'); for i = 1:length(dims2) if ~ismember(dims2{i}, dims1) dimid(length(dims1)+i) = netcdf.defDim(ncid, dims2{i}, length(ncread(filename2, dims2{i}))); end end for i = 1:length(vars2) if ~ismember(vars2{i}, vars1) varid(length(vars1)+i) = netcdf.defVar(ncid, vars2{i}, 'double', dimid(length(dims1)+find(strcmp(dims2, ncread(filename2, vars2{i}))))); end end for i = 1:length(dims3) if ~ismember(dims3{i}, [dims1 dims2]) dimid(length(dims1)+length(dims2)+i) = netcdf.defDim(ncid, dims3{i}, length(ncread(filename3, dims3{i}))); end end for i = 1:length(vars3) if ~ismember(vars3{i}, [vars1 vars2]) varid(length(vars1)+length(vars2)+i) = netcdf.defVar(ncid, vars3{i}, 'double', dimid(length(dims1)+length(dims2)+find(strcmp(dims3, ncread(filename3, vars3{i}))))); end end netcdf.endDef(ncid); for i = 1:length(vars2) netcdf.putVar(ncid, varid(length(vars1)+i), ncread(filename2, vars2{i})); end for i = 1:length(vars3) netcdf.putVar(ncid, varid(length(vars1)+length(vars2)+i), ncread(filename3, vars3{i})); end % 关闭文件 netcdf.close(ncid); ``` 在这个示例代码中,我们首先读取第一个nc文件变量名和维度信息,并创建一个新的nc文件。然后,我们读取第二个和第三个nc文件变量和维度信息,并将它们追加到新文件中。注意,我们需要检查变量和维度是否已经存在于新文件中,如果存在,就不需要重复定义。最后,我们将所有变量入新文件中,并关闭文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是一只白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值