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

在matlab中查找两个特定时间之间的范围,matlab,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); da

我有一个年度数据集:

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
如果输入一个矩阵,它将在每列上独立运行。我们可以使用它来准备一个矩阵,其中每列包含06:00到18:00的时间间隔的值,并应用
范围

  • 棘手的部分是操纵365x24×10矩阵以获得正确的列:

    A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
    
    这将产生三维24x10x365矩阵,从中可以提取第7行到第18行

  • 下一步是应用
    范围
    ,并将结果转换回二维365x10矩阵:

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

    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;
    
    如果输入一个矩阵,它将在每列上独立运行。我们可以使用它来准备一个矩阵,其中每列包含06:00到18:00的时间间隔的值,并应用
    范围

  • 棘手的部分是操纵365x24×10矩阵以获得正确的列:

    A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
    
    这将产生三维24x10x365矩阵,从中可以提取第7行到第18行

  • 下一步是应用
    范围
    ,并将结果转换回二维365x10矩阵:

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

    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;
    

    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]
    

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

    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]
    


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

    我不明白如何仅使用一个值来表示温度范围。温度范围在每天06:00到18:00之间,因此有13个值尚不清楚。你想得到一个365×10的矩阵。我推断365对应于天数,10对应于测量次数。06:00-18:00的温度在哪里起作用?是否要在此时间段内平均值?请更正矩阵。如果查看变量DateV,它将以小时为单位显示一天中的时间“DateV(:,4)”,因此对于第一天,即2009-01-01,我想计算第7行和第18行之间的温度范围,即分别为06:00和18:00。因此,对于第一天和第一次测量(深度),我可以通过以下方式计算:范围(dat2(7:18,1)),然后我需要对第二列重复此步骤,然后是第三列,依此类推,然后在第二天重复此步骤,从第25行开始。这更清楚了吗?我想是的。我已经发布了一个答案,希望能有所帮助。我不明白您希望如何仅使用一个值来表示温度范围。温度范围在每天06:00到18:00之间,因此有13个值。这仍然不清楚。你想得到一个365×10的矩阵。我推断365对应于天数,10对应于测量次数。06:00-18:00的温度在哪里起作用?是否要在此时间段内平均值?请更正矩阵。如果查看变量DateV,它将以小时为单位显示一天中的时间“DateV(:,4)”,因此对于第一天,即2009-01-01,我想计算第7行和第18行之间的温度范围,即分别为06:00和18:00。因此,对于第一天和第一次测量(深度),我可以通过以下方式计算:范围(dat2(7:18,1)),然后我需要对第二列重复此步骤,然后是第三列,依此类推,然后在第二天重复此步骤,从第25行开始。这更清楚了吗?我想是的。我已经发布了一个答案,希望有帮助。很好的解决方案。虽然可以使代码更通用,即不定义行7:18,但代码使用提供的日期向量查找指定时间段的行号。如果给定日期的数据不是在午夜开始,这将避免错误。@user1155751我将看看我能做些什么:-)太好了。我在考虑做一些类似于--newDateV=permute的事情(重塑(DateV’,[size(DateV,2),length(unique(DateV(:,4)),…length(unique(floor(Jday-datenum(DateV(1,1,0))))),[2,1,3]);找到我们想要的一天中的小时数,然后用newDateV中这些小时数的索引替换7:18,尽管这似乎是一个冗长的方法。我已经修改了我原来的帖子以提供解决方案。我展示的方法按要求工作,但它感觉我把过程复杂化了。@user1155751我已经修改了解决方案。这是你想要的吗?请注意,它仅使用
    DateV
    的前24个值,并将它们应用于整个日期集。如果在不同的日子里,这样的时间段包含不同数量的样本,那么矩阵就不能像我建议的那样进行重塑,需要另一种解决方案。很好的解决方案。虽然可以使代码更通用,即不定义行7:18,但代码使用提供的日期向量查找指定时间段的行号。如果给定日期的数据不是在午夜开始,这将避免错误。@user1155751我将看看我能做些什么:-)太好了。我在考虑做一些类似于--newDateV=permute的事情(重塑(DateV’,[size(DateV,2),length(unique(DateV(:,4)),…length(unique(floor(Jday-datenum(DateV(1,1,0))))),[2,1,3]);找时间