【问题标题】:How to pull specific indices out of a character array in a loop?如何在循环中从字符数组中提取特定索引?
【发布时间】:2019-06-18 12:45:00
【问题描述】:

我有一个数组,其中包含格式为 yyyymmdd 的多个日期,存储为 50x1 双精度。我正在尝试提取年、月和日,以便可以使用 datenum 为每个日期分配一个序列号。

索引单个日期,转换使用 str2num,然后索引和提取适当的值可以正常工作,但是当我尝试遍历日期列表时它不起作用 - 仅返回数字 2 的变体。

dates = [20180910; 20180920; 20181012; 20181027; 20181103; 20181130; 20181225];

% version1
datesnums=num2str(dates); % dates is a list of dates stored as 
integers

for i=1:length(datesnums)
    pullyy=str2num(datesnums(1:4));
    pullmm=str2num(datesnums(5:6));
    pulldd=str2num(datesnums(7:8));
end

还有

%version2
datesnums=num2str(dates,'%d')

for i = 1:length(datesnums)
    dd=datenum(str2num(datesnums(i(1:4))),str2num(datesnums(i(5:6))), 
    str2num(datesnums(i(7:8))));
end

我正在尝试生成一个新数组,它只是输入日期的序列号。在显示的示例中,我只获得单个整数值,我知道这是因为循环不正确,并且我收到错误提示“索引超过数组元素的数量 (1)”。对于版本 1。当我让它成功循环遍历所有内容时,对于每个不正确的日期,输出只是 '2222','22,'22'。我究竟做错了什么?我需要合并一个元胞数组吗?

【问题讨论】:

  • 请编辑您的问题并提供MCVE
  • 首先考虑将日期放入字符串中,然后将它们存储在元胞数组中,而不是整数向量中

标签: arrays matlab indices


【解决方案1】:

循环获取所有年月日:

datesnums=num2str(dates);

for i=1:size(datesnums, 1)
    pullyy(i) = str2num(datesnums(i,1:4));
    pullmm(i) = str2num(datesnums(i,5:6));
    pulldd(i) = str2num(datesnums(i,7:8));
end

实际上,您可以无需循环

pullyy = str2num(datesnums(:,1:4));
pullmm = str2num(datesnums(:,5:6));
pulldd = str2num(datesnums(:,7:8));

解释

如果dates 向量是一个 [6x1] 数组:

dates =[...
    20190901
    20170124
    20191215
    20130609
    20141104
    20190328];

datesnums=num2str(dates); 创建一个大小为[6x8] 的字符矩阵,其中每一行对应dates 中的一个元素:

datesnums =

  6×8 char array

    '20190901'
    '20170124'
    '20191215'
    '20160609'
    '20191104'
    '20190328'

因此,在循环中,您需要引用每个日期的行索引和列索引来提取年、月和日。

【讨论】:

  • 成功了,谢谢!你能解释一下为什么应该使用大小而不是长度,以及为什么我需要一个逗号来循环所有值吗?
  • @user250829:size(datesnums, 1) 是因为datesnums 的大小是 [50x8]。我想迭代 50 行,而不是 8 列。使用长度将选择最长的维度,在这种情况下为 50,但如果您只有 6 个日期,长度将为 8。
  • 我更新了我的答案,举例说明如何在没有循环的情况下获取年月日
【解决方案2】:

我能想到的最简单的解决方案是:

SN = datenum(num2str(dates),'yyyymmdd')

您只需指定日期格式'yyyymmdd'

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多