【问题标题】:MATLAB Find the indexes that have a particular dateMATLAB 查找具有特定日期的索引
【发布时间】:2014-04-30 19:47:12
【问题描述】:

我试图在Date3 中找到索引,这是一个从 01/01/2008 到 01/31/2014 的日期数字列向量,已重复多次,与 day 匹配。我基本上想将 idx 组织成一个像idx{i} 这样的单元格数组,其中每个单元格都是一天(所以返回 Date3 等于天的所有索引,其中天是 01/01/2008 和 01/31/ 之间的一天之一2014. 最终,我想通过将我找到的索引应用于变量Data2 来提取每天的数据(重塑 Data2 以便代替数据集中的长列向量,我将有一个单元数组,其中每个单元格是一天的所有数据)

这是我一直在做的:

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

【问题讨论】:

  • 你应该参考你的第一个问题。
  • 怎么样?只是链接到它?
  • 是的,只需在开头说“除了我的 [previous question]”之类的内容并建立链接即可。

标签: matlab find reshape


【解决方案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

【讨论】:

    【解决方案2】:

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

    这当然假设 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
    

    我能看到的唯一问题是,如果您没有每天的数据,您不一定知道每个单元格代表哪一天。这可以通过存储带有数据的日期向量来轻松解决。

    【讨论】:

    • FIND 函数实际上会减慢代码的速度。只需idx=Date3==day; 就足够了。但我认为这只是一个错字。 OP 想要将数据组织成一个元胞数组。
    【解决方案3】:

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

    你可以在索引上使用它

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

    或直接在数据上

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2021-12-31
      • 2023-04-02
      相关资源
      最近更新 更多