在matlab中查找两个特定时间之间的范围

时间:2013-02-26 15:46:19

标签: matlab

我有一个年度数据集:

Jday = datenum('2009-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
    datenum('2009-12-31 23:00','yyyy-mm-dd HH:MM');
DateV = datevec(Jday);
dat = 1+(10-1).*rand(length(Jday),10);
noise = 10*sin(2*pi*Jday/32)+20;
for i = 1:size(dat,2);
    dat2(:,i) = dat(:,i)+noise';
end

表示通过水柱记录的温度测量值。我想计算每天06:00到18:00之间的温度范围,这样我最终得到每个深度365个值,所以最终矩阵为365x10。

我可以通过以下方式指定个人日期:

[~,~,b] = unique(DateV(:,2:3),'rows');

但是我不知道如何只考虑上午06:00到下午18:00之间记录的值。任何人都可以提供一些有关最佳方法的信息吗?

修正:稍长答案

Jday = datenum('2009-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
    datenum('2009-12-31 23:00','yyyy-mm-dd HH:MM');
DateV = datevec(Jday);
dat = 1+(10-1).*rand(length(Jday),10);
noise = 10*sin(2*pi*Jday/32)+20;
for i = 1:size(dat,2);
    dat2(:,i) = dat(:,i)+noise';
end

for i = 1:size(dat2,2);
    data = [DateV(:,4),dat2(:,i)]; % obtain all hours from DateV array

    dd = find(data(:,1) == 6); % find 06:00
    dd(:,2) = find(data(:,1) == 18); % find 18:00

    for ii = 1:size(dd,1);
        result(ii,i) = range(data(dd(ii,1):dd(ii,2),2)); % calculate range
    end
end

2 个答案:

答案 0 :(得分:2)

如果range带有矩阵,则它会独立地对每列进行操作。我们可以使用它来准备一个矩阵,其中每列包含时间间隔为06:00到18:00的值,并应用range

  1. 棘手的部分是操纵你的365x24×10矩阵以使列正确:

    A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
    

    这应该会产生3-D 24x10x365矩阵,从中可以提取第7行到第18行。

  2. 下一步是应用range并将结果转换回2-D 365x10矩阵:

    result = permute(range(A(7:18, :, :)), [3, 2, 1]);
    
  3. 因此,完整的解决方案是:

    A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
    result = permute(range(A(7:18, :, :)), [3, 2, 1]);
    

    修改
    为了使解决方案更通用,您可以使用DateV来获取所需行的索引:

    idx = DateV(1:24, 4) >= 6 & DateV(1:24, 4) < 18;
    

    然后在解决方案中使用它:

    A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
    result = permute(range(A(idx, :, :)), [3, 2, 1]);
    

答案 1 :(得分:2)

1987年1月1日至1987年12月31日之间的每小时日期范围:

start_date = datenum(1987,01,01,00,00,00)
end_date = datenum(1987,12,31,23,00,00)
interval = datenum(1987,0,0,1,0,0)-datenum(1987,0,0,0,0,0) % 1 hour interval

date_range = [start_date:interval:end_date]

非常简单,也适用于闰年。