MATLAB查找具有特定日期的索引

时间:2014-04-30 19:47:13

标签: matlab find reshape

我试图找到Date3中的索引,这是一个从08/01/2008到2014年1月31日的日期编号的列向量,已经多次重复,匹配day。我基本上想把idx组织成一个像idx{i}这样的单元格数组,其中每个单元格都是一天(所以返回Date3等于day的所有索引,其中day是01/01/2008和01之间的一天31/2014。最后,我想通过将我找到的索引应用于变量Data2来取出每天的数据(重塑数据2,以便代替数据浓度的长列向量而不是I' ll有一个单元格数组,其中每个单元格都是一天的所有数据)

这就是我一直在做的事情:

for day = datenum(2008,01,01):1:datenum(2014,01,31); % All the days under consideration
    idx = find(Date3, day); % Index of where Date3 equals the day under consideration
    Data_PM25 = Data2(idx); % Pull out the data based on the idx
end

实施例: 如果Date3看起来如下(它实际上要大得多,并且会重复多次)

  733408
  733409
  733410
  733411
  733412
  733413
  733414
  733415
  733416
  733417
  733418
  733419
  733420
  733421
  733408
  733409
  733410
  733411
  733412
  733413
  733414
  733415
  733416
  733417
  733418
  733419
  733420
  733421

我希望idx成为

`idx{1}` = (1, 15) % Where 733408 repeats
`idx{2}` = (2, 16) % Where 733409 repeats
...

然后Data2,看起来像:

    [NaN]
    [NaN]
    [NaN]
    [NaN]
    [NaN]
    [NaN]
    [NaN]
    [NaN]
    [NaN]
    [NaN]
    '25.8'
    '26.1'
    '28.9'
    '37.5'
    '25.2'
    '20' 
    '32.3'
    '41' 
    '46.7'
    '28.2'
    '34.5'
    '31.8'
    '37.6'
    '45.5'
    '54.9'
    '54.8'
    '36.3'
    '18.5'

现在看起来像

'Data_PM25{1}' = ([NaN], '25.2')
'Data_PM25{2}' = ([NaN], '20')

...

当然,实际输出将比两场比赛长得多。

似乎正在发生的事情是,我将每dayDate3进行比较,这是一个日期列表,所以我回来了所有的日子。

此问题扩展了上一个问题:Find where a value matches and concatentate into column vector MATLAB

3 个答案:

答案 0 :(得分:1)

使用find(ismember ...)查找某一天在Date3的长列中显示的位置,然后用它来从当天提取所有数据,Lat和Lon。

group2cell由于某种原因,创造了应该是天数的两倍。基本上,它以某种方式退出了两年,其中第一年退出(1:365或1:366)是随机的。

day = datenum(years(y), 01, 01):datenum(years(y), 12, 31); % Create a column vector of all days in one year
for d = 1:length(day)
    % Find index where Date3 matches one day, one day at a time
    ind{d} = find(ismember(datenum(Date3), day(d)) == 1);
    data_O3{d} = Data2(ind{d});
end

答案 1 :(得分:0)

这个怎么样:结果应该是向量的单元格数组,每个向量对应于给定日期的数据。

这当然假设Date3和Data2的大小相同

 Date3=[733408
  733409
  733410
  733411
  733412
  733413
  733414
  733415
  733416
  733417
  733418
  733419
  733420
  733421
  733408
  733409
  733410
  733411
  733412
  733413
  733414
  733415
  733416
  733417
  733418
  733419
  733420
  733421];
Data2 = Date3.*50; % //just some dummy data for testing
Data_pm25=cell(0);
for day=datenum(2008,01,01):datenum(2014,01,01)
    idx=day==Date3;
    Data_pm25 = [Data_pm25,Data2(idx)];
end

我能看到的唯一问题是,如果你每天都没有数据,你就不必知道每个细胞代表哪一天。通过存储带有数据的日期向量可以很容易地解决这个问题。

答案 2 :(得分:0)

正如我在您提到的其他问题中提到的,请尝试从FileExchange中获取GROUP2CELL函数。

您可以在索引上使用它

[newidx, uniqueDate] = group2cell(idx,Date2);

或直接在数据上

[Data_PM25, uniqueDate] = group2cell(Data2,Date2);

uniqueDate将是所有唯一日期的数组。 uniqueDate(i)将与Data_PM25(i)对应。