Как извлечь определенные индексы из массива символов в цикле? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть массив, который содержит несколько дат в формате ггггммдд, хранящихся в виде двойного 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 »для каждой отдельной даты, которая является неправильной. Что я делаю неправильно? Нужно ли включать массив ячеек?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Самое простое решение, о котором я могу подумать:

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

Вам нужно только указать формат даты, который 'yyyymmdd'

1 голос
/ 18 июня 2019

Чтобы получить все годы, месяц и дни в цикле:

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'

Так что в цикле вам нужно обратиться к индексу строки для каждой даты и индексам столбцов, чтобы извлечь годы, месяц и дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...