遥感

基于Matlab的中国地面气候资料日值数据集(V3.0)快速处理

2019-12-28  本文已影响0人  画长空_yin

本次主要是对中国气象数据网的V3.0地面气象观测数据集进行快速处理,将原先分散的txt各个要素整合到一个列表中,一行代表一个站点。直接从全国的数据集中来提取出来自己想要的站点数据集,该过程也包含了一年缺测数据低于30天的站点数据线性内插,同时参考数据说明对异常值进行了处理。本次以新疆省内的气象站点为例子,从全国V3.0数据集中提取新疆站点。

% author email: yinlichang3064@163.com
station=xlsread('D:\xj\新疆.xlsx');% 一列新疆的站点数据
%
for year=2000:2017
    datasum=[];
   for mon=1:12
       if mon<10
            filename_pre=['F:\Day1951-2012yuanshi\DAY_PRE195101201612\SURF_CLI_CHN_MUL_DAY-PRE-13011-',int2str(year),'0',int2str(mon),'.TXT'];
            filename_temp=['F:\Day1951-2012yuanshi\DAY_TEM195101201612\SURF_CLI_CHN_MUL_DAY-TEM-12001-',int2str(year),'0',int2str(mon),'.TXT'];
            filename_rhu=['F:\Day1951-2012yuanshi\DAY_RHU195101201612\SURF_CLI_CHN_MUL_DAY-RHU-13003-',int2str(year),'0',int2str(mon),'.TXT'];
            filename_SSD=['F:\Day1951-2012yuanshi\DAY_SSD195101201612\SURF_CLI_CHN_MUL_DAY-SSD-14032-',int2str(year),'0',int2str(mon),'.TXT'];
            filename_WIN=['F:\Day1951-2012yuanshi\DAY_WIN195101201612\SURF_CLI_CHN_MUL_DAY-WIN-11002-',int2str(year),'0',int2str(mon),'.TXT'];
            filename_prs=['F:\Day1951-2012yuanshi\DAY_PRS195101201612\SURF_CLI_CHN_MUL_DAY-PRS-10004-',int2str(year),'0',int2str(mon),'.TXT'];
       else
            filename_pre=['F:\Day1951-2012yuanshi\DAY_PRE195101201612\SURF_CLI_CHN_MUL_DAY-PRE-13011-',int2str(year),int2str(mon),'.TXT'];
            filename_temp=['F:\Day1951-2012yuanshi\DAY_TEM195101201612\SURF_CLI_CHN_MUL_DAY-TEM-12001-',int2str(year),int2str(mon),'.TXT'];
            filename_rhu=['F:\Day1951-2012yuanshi\DAY_RHU195101201612\SURF_CLI_CHN_MUL_DAY-RHU-13003-',int2str(year),int2str(mon),'.TXT'];
            filename_SSD=['F:\Day1951-2012yuanshi\DAY_SSD195101201612\SURF_CLI_CHN_MUL_DAY-SSD-14032-',int2str(year),int2str(mon),'.TXT'];
            filename_WIN=['F:\Day1951-2012yuanshi\DAY_WIN195101201612\SURF_CLI_CHN_MUL_DAY-WIN-11002-',int2str(year),int2str(mon),'.TXT'];
            filename_prs=['F:\Day1951-2012yuanshi\DAY_PRS195101201612\SURF_CLI_CHN_MUL_DAY-PRS-10004-',int2str(year),int2str(mon),'.TXT'];
       end
       
       data_prec=importdata(filename_pre);
       data_temp=importdata(filename_temp);
       data_rhu=importdata(filename_rhu);
       data_ssd=importdata(filename_SSD);
       data_win=importdata(filename_WIN);
       data_prs=importdata(filename_prs);
       totalsum=[];
       for i=1:size(station,1)
           sta=station(i);
           syz_prec=find(data_prec(:,1)==sta);
           syz_temp=find(data_temp(:,1)==sta);
           syz_rhu=find(data_rhu(:,1)==sta);
           syz_ssd=find(data_ssd(:,1)==sta);
           syz_win=find(data_win(:,1)==sta);
           syz_prs=find(data_prs(:,1)==sta);
           if length(syz_prec)==length(syz_temp) && length(syz_temp)==length(syz_rhu) && length(syz_rhu)==length(syz_ssd) && length(syz_ssd)==length(syz_win) && length(syz_prs)==length(syz_win)
               dates1=data_prec(syz_prec,1:7);
               precz=data_prec(syz_prec,8:10);
               tempz=data_temp(syz_temp,8:10);
               rhuz=data_rhu(syz_rhu,8:9);
               ssdz=data_ssd(syz_ssd,8);
               winz=data_win(syz_win,8:9);
               prsz=data_win(syz_prs,8);
               total1=[dates1,precz,tempz,rhuz,ssdz,winz,prsz]; %1-7 8-10 11-13 14-15 16 17-18 ,19
               totalsum=[totalsum;total1];
           end
       end
       datasum=[datasum;totalsum];
   end
   %首先对异常数据进行处理
    %台站海拔高度 +100000 当台站海拔高度为估测值时,在估测数据基础上加100000
    dem=datasum(:,4);
    dem(dem>100000)=dem(dem>100000)-100000;
    datasum(:,4)=dem;
    %各要素项   32766   数据缺测或无观测任务
    
    datasum(datasum==32766)=NaN; %待插补数据
    
    % 风速    +1000   当风速超过仪器测量上限时,在上限数据基础上加1000
    winz=datasum(:,17:18);
    winz(winz>1000)=winz(winz>1000)-1000; 
    datasum(:,17:18)=winz;
    % 降水量   32700   表示降水"微量"
    %           32XXX   XXX为纯雾露霜
    %           31XXX   XXX为雨和雪的总量
    %           30XXX   XXX为雪量(仅包括雨夹雪,雪暴)
    prec=datasum(:,8:10);
    prec(prec==32700)=0.1;%相当于0.01mm了,原有的数据单位是0.1mm
    prec(prec>32000 & prec<32999)=prec(prec>32000 & prec<32999)-32000;
    prec(prec>31000 & prec<31999)=prec(prec>31000 & prec<31999)-31000;
    prec(prec>30000 & prec<30999)=prec(prec>30000 & prec<30999)-30000;
    datasum(:,8:10)=prec;
    % -10000    实际温度(零下)超仪器下限刻度,在下限数据基础上减10000
    temp=datasum(:,11:13);
    temp(temp<-10000)=temp(temp<-10000)+10000;
    datasum(:,11:13)=temp;
    
    % 对缺测数据进行填补,采用线性内插法
    total=[];
    for i=1:size(station,1)
        sta=station(i);
        sy=find(datasum(:,1)==sta);
        if length(sy)>=365
            value=datasum(sy,:); %得到该站点全部的数据
            cd=size(value,1);
            % 依次进行插值处理
            for k=8:19 %要素从第15列开始
                   element=value(:,k);
                   syz=find(~isnan(element)); %找到非NaN值
                if length(syz)>340 & length(syz)<cd %高于340个有效值
                    if isnan(element(1))
                        element(1)=element(syz(1)) % 如果第一个为NaN值,则用邻近值进行填补
                    end
                    if isnan(element(cd))
                        element(cd)=element(syz(end)) % 如果最后个为NaN值,则用邻近值进行填补
                    end
                    valuez=interp1(syz,element(syz),[1:cd])';%得到有效点
                else
                    valuez=element;
                end
                value(:,k)=valuez;
            end
        end
        total=[total;value];
    end
    filename=['F:\Day1951-2012yuanshi\xj\',int2str(year),'年新疆气象要素数据集.xlsx'];
    xlswrite(filename,total)
end

结果如下


QQ图片20191228141625.png

注意:经度,纬度和高程的顺序在使用时请再次确认下,作者表示很懒,不想在去确认了

更多需求,请查看个人介绍

上一篇下一篇

猜你喜欢

热点阅读