基于ANUSPLIN的批量气象插值-从数据处理到最终结果(4)

缺测气象数据的填补

在(3)中提到,某些站点的气象数据会存在着缺失问题,当缺测数据很多时,可直接去掉该站点,当较少时,则需要采取手段进行填充。本文线性内插法进行补齐

线性内插法

for year=1980:2015
    if mod(year,4)==0
        cd=366;
    else
        cd=365;
    end
    %降水
    data=xlsread(strcat('H:\Day1951-2012yuanshi\插值格式\1980-2016\未修正\中国PRE',int2str(year),'.xlsx')); %读取中国1980年降水
    for i=1:size(data,1) %对降水数据进行循环
        data1=data(i,:);
        data_pre=data1(5:cd+4);%前四位分别是站点,经纬度和高程,降水数据从第五位开始
        sy=find(abs(data_pre)>=0);%找到数据中绝对值大于0的部分,缺失值NaN值不会大于0
        if length(sy)<cd %当满足条件的长度小于天数时,表明存在着空值部分
            if length(sy) >340 %当满足条件的超过350天,即95%以上时进行内插处理,否则直接去掉该点
               %首先判断前段
               data_pre1=data_pre(1:5);%取前五个进行判断,有空值部分取其他值的均值
               sy1=find(abs(data_pre1)>=0);
               data_pre1_average=mean(data_pre1(sy1));
               for j=1:5
                   if isnan(data_pre1(j))
                     data_pre1(j)=data_pre1_average; 
                   end
               end
               %再判断后段
               data_pre2=data_pre(cd-4:cd);%对后五个进行判断
               sy1=find(abs(data_pre2)>=0);
               data_pre2_average=mean(data_pre2(sy1));
               for j=1:5
                   if isnan(data_pre2(j))
                     data_pre2(j)=data_pre2_average; 
                   end
               end
               data_pre(1:5)=data_pre1;
               data_pre(cd-4:cd)=data_pre2;
               %前后完整后采用线性内插函数对中间缺失值进行内插
               sy1=find(abs(data_pre)>=0);
               juzheng=[sy1;data_pre(sy1)];
               data_pre_new=interp1(sy1,data_pre(sy1),[1:length(data_pre)]);
               data1(5:cd+4)=data_pre_new;
            else
                data1=[];
            end
        end
            data(i,:)=data1;
    end
        biaotou=[NaN,NaN,NaN,NaN,[1:cd]];
        data=[biaotou;data];
        filename=strcat('H:\Day1951-2012yuanshi\插值格式\1980-2016\未修正\缺测修正的中国PRE',int2str(year),'.xlsx');
        xlswrite(filename,data);
end

通过上述方法能够将一年中缺测少于5%的站点数据补齐。
更多需求,请查看个人介绍

推荐阅读更多精彩内容