1

我正在编写一个函数,该函数需要一个日期输入向量,我将其指定为儒略日期,以及一系列值(作为向量)。在函数中,我使用预定义的窗口大小来删除数据中的任何 nan。例如:

t = transpose(1/24:1/24:40);
data1 = 1+(30-1).*rand(length(t),1);
Randm = floor(1+(length(t)-1).*rand(120,1));
data1(Randm) = nan;
figure(1);
plot(data1,'linewidth',3);
hold on;

dailyData = reshape(data1,40,[]);
nanMap = isnan(dailyData);
validValuesPerDay = sum(~nanMap, 2);
nonNanData = dailyData;
nonNanData(nanMap) = 0;
sumPerDay = sum(nonNanData, 2);
dailyMeans = sumPerDay ./ validValuesPerDay;
dailyMeans = repmat(dailyMeans, [1 24]);
repairedData = dailyData;
repairedData(nanMap) = dailyMeans(nanMap);
data1 = reshape(repairedData,[],1);
plot(data1,'--r');

我现在面临的问题是如何处理分辨率与每小时(例如每天或每周)不同的数据,因为这会在我使用 reshape 时影响代码。有人对如何处理这个问题有一些建议吗?我正在考虑按照将窗口大小(我的意思是使用整形时)指定为数据长度的一部分来做一些事情。

4

1 回答 1

1

通常,您必须为所需的所有不同功能编写单独的例程。例如,如果您获得每日数据,您想做什么?平均数周?两周?几个月?年?

因此,最可靠的选择是(假设您总是得到线性网格时间):

switch t(2)-t(1)
    case 1/24 % hourly data
        dailyData = reshape(data1,[], 24);
        ... etc.

    case 1 % daily data
        weeklyData = reshape(data1,[], 7);
        ... etc.

    case 7  % weekly data
        yearlyData = reshape(data1,[], 52);
        ... etc.

    otherwise
        ... issue error

end

请注意,这reshape可能是您在交换机中唯一需要做的事情;其余代码将保持不变。您可能想重新考虑变量名...

于 2012-11-09T17:44:40.510 回答