0

我有一个数据集,其中有给定时间段的一些测量值:

Jday = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-07-31 23:00','yyyy-mm-dd HH:MM');
Dat = rand(length(Jday),1);

我现在想确保数据集涵盖所调查的给定年份的整个年度周期(上述 2010 年和 2011 年)。因此,鉴于数据是每小时测量一次,我如何用 NaN 填充数据集的剩余时间,以便最终变量的长度等于:

Jday = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');

例如,Dat 在 2011-07-31 23:00 和 2011-12-31 23:00 之间会有 NaN 吗?

4

3 回答 3

1

如果您有 R2013a,那么您还可以使用padarray()

B = padarray(A,padsize, NaN, 'post')

注意:如果您希望合并两组日期,例如 A 和 B,其中不失一般性 A 包括 B,那么您可能有 a_n <= b_n < a_n+1 在这种情况下不能简单地填充数组,但您需要填写NaN。这涉及使用ismember()和逻辑索引,甚至accumarray().

于 2013-06-22T14:20:02.273 回答
0

您可以就地扩展阵列以填充末端或使用ismember. 假设你有这个。

AllDates = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');
Dates = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-07-31 23:00','yyyy-mm-dd HH:MM');
Dat = rand(length(Jday),1);

如果您只是将 NaN 添加到末尾(也就是说,您知道 Dates 匹配 AllDates 中的前 n 个点),您可以使用对不存在元素的简单分配来扩展数组。

Dat(end+1:numel(AllDates)) = NaN;

如果您需要识别任意位置的漏洞,您可以使用ismember将观察结果放入与较大日期集匹配的数组中。

Dat2 = NaN(size(AllDates));
[tf,ix] = ismember(Dates, AllDates);
if ~all(tf);  error('Some dates not in reference set');  end
Dat2(ix) = Dat;

顺便说一句,您可能想使用numel而不是length. 它更笼统;length如果您有二维数组,可能会给您带来问题。

于 2013-07-01T04:39:15.857 回答
0

如果您确定只需要NaN在最后填充数据,您可以简单地使用:

pad_length = length(Jday) - length(Dat);
pad = ones(pad_length,1)*NaN;
Dat = [Dat;pad];
于 2013-06-22T09:50:35.600 回答