我有四列河流流量数据格式(年,月,日,数据)。我想检查数据,以确保没有任何丢失的块,如果有的话,创建一个新的数据数组('newdates'),其中添加了缺少的日期(第1列),以及缺失的NaN值数据(第2栏)。
我通过从当天的datenum减去前一天的datenum来检查缺失的数据(如果它大于1,则缺少数据)。我的代码可以使用,但我每次都省略了数据的最后一天。 我生成的用于检查每一行的循环是数据的长度减去1,因为如果我允许它是数据的长度,它将无法检查两个最后日期之间的差异,作为日期矢量不够大。我知道这不是一个过于复杂的事情,但我似乎无法弄明白。 任何帮助,将不胜感激。代码如下:
%以年,月,日,河流
格式加载数据样本文件>data=load('dmf_21002_279631_Q_COMPLETE_matlab.csv');
>yr=data(:,1);
>mth=data(:,2);
>day=data(:,3);
>flow=data(:,4);
>dates=datenum([yr,mth,day]);
>icounter=1;
%这是索引'newdates'
的计数器>ndcounter=0
>for i =1:(length(dates)-1);
>ndcounter=ndcounter+1;
>if dates(i+1)-dates(i)==1;
>newdates(ndcounter,1)=dates(i,1);
>newdates(ndcounter,2)=data(i,4);
>elseif (dates(i+1)-dates(i))~=1;
>newdates(ndcounter,1)=dates(i,1);
> newdates(ndcounter,2)=data(i,4);
%计算数组中缺少的数据天数
>daysmissing(icounter,1)=(dates(i+1)-dates(i))-1;
%通过将ii添加到上一个来创建缺少的日期 %datenum(对缺少的数据长度执行此操作)
>for ii=1:daysmissing;
>newdates((i+ii),1)=((newdates(i))+ii);
> newdates((i+ii),2)=NaN;
> end
>ndcounter=ndcounter+daysmissing;
>disp('Missing data found');
> missingidx(icounter)=i;
>icounter=icounter+1;
>end
>end
>newdates(newdates==-999)=NaN;
答案 0 :(得分:1)
我建议你研究一下timeseries
课程。在timeseries
个对象上,您可以调用resample()
来创建缺失值。
MWE:
dates = datenum([2016 2016 2016], [4 4 4], [10 11 13]);
data = [0 1 3];
ts = timeseries(data, dates);
ts2 = ts.resample(datenum([2016 2016 2016 2016], [4 4 4 4], [10:13]));
figure(1); hold on;
ts.plot('bo--');
ts2.plot('rx:');