Matlab读取 ERA5 nc 文件,era5降水高估问题

1. 识别nc文件中的变量信息

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

M = ncinfo('C:\1Data\era5\2006-2016\201111\data.nc'); % 带绝对路径的

识别出来是这个样子:

Dimensions 就是维度,一般指 经度(lon)、纬度(lat)和时间(time)

Variables 就是变量,这里边有降水、气温、uv风速和那三个维度,共七个

2. 读取 nc 文件的变量

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

source:你要读取的 nc 文件

varname:变量

start:读取维度的起始值,例如 [10 10 10] ,表示三个维度都从第10个开始读

count:读取的维度的长度,例如 [5 5 5],配合上行的start,表示三个维度都从第10个开始读,都读到第14个,即每个维度读 5 个

stride:读取变量的间隔值,例如[1 2 1],表示读取第一个维度的时候,变量序号之间相隔1(就是正常从头往后读取),第二个维度的时候,变量序号之间相隔2(就是隔一个读一个)

以上参考

Matlab—什么是nc文件,以及如何读取导入_会飞的羊YOUNG

3. 根据 nc 文件中的 lon 和 lat 绘制格网

[x,y]=meshgrid(lat,lon);

x =
     1     2     3
     1     2     3
     1     2     3
y =
     2     2     2
     3     3     3
     4     4     4  

【matlab】函数meshgrid的用法详解(生成网格矩阵)和ndgrid的区别及用法_Treysure

4. 读取 nc 文件 matlab

 matlab 读取 era5 数据

%查看数据
M = ncinfo('200601.nc');

%读取数据
lon = ncread('200601.nc','longitude');
lat = ncread('200601.nc','latitude');
time = ncread('200601.nc','time');
tp = ncread('200601.nc','tp');   %要读取的变量

%转换时间格式
t0 = datetime(1900,1,1);         %确定时间起始点
t = t0 + double(time(:))/24;     %转换时间
t_str = string(t);               %将时间从datetime转str

%输出经纬度、变量
r = 1;
data = zeros(length(lon)*length(lat)*length(time),3);
for i= 1 : length(lon)
    for j = 1 : length(lat)
        for k = 1 : length(time)
            data(r,1) = lon(i);  %在第一列写入经度
            data(r,2) = lat(j);  %在第二列写入纬度
            data(r,3) = tp(i,j,k); %在第三列写入tp
            r = r+1;
        end
    end
end

转载自:Matlab读取nc数据_哔哩哔哩_bilibili毛发浓密的猿工Matlab读取nc数据_哔哩哔哩_bilibili

matlab给出的为什么时间都是9000多的解释,因为时间单位无法当字符或数字写入,matlab字符串和时间不能写道同一个矩阵中

要从日期时间转换为数值,请首先减去起始日期时间,然后使用
SECONDS、MINUTES、HOURS、DAYS 或 YEARS 函数转换为数值。

1.4 读取 lon、lat 到 xls 文件

由于 arcgis 制作点集需要 xls 文件的经纬度,因此先将经纬度单独读到一个 xls 文件

使用如下代码将经纬度读取到 matlab 的工作表,然后复制到xls就可以了

cd C:\1Data\ERA5\exp

lon = ncread('200601.nc','longitude');
lat = ncread('200601.nc','latitude');

r = 1;
lon_lat = zeros(length(lon)*length(lat),2);
for i= 1 : length(lon)
    for j = 1 : length(lat)
        lon_lat(r,1) = lon(i);
        lon_lat(r,2) = lat(j);
        r = r+1;
    end
end

era5的降水数据存在严重高估问题

同德县 force_35.2000_100.6000
era5数值:792    实际值:440
兰州 force_36.0000_103.4000
era5数值:565    实际值:327
太原 force_37.3000_112.6000
era5数值:1071    实际值:456
济南 
era5数值:1133    实际值:1039

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值