在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的时间间隔的值,并应用范围
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的时间间隔的值,并应用范围
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]);找时间