Datetime () возвращает неправильные значения - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь построить график в Matlab, используя значения для оси X из массива datetime .
Пример одного значения: '2016-06-03T13: 37: 20.315Z'
Сначала значения сохраняются в массиве структур, откуда я пытаюсь скопировать их в отдельный массив.Я делаю это с помощью следующего кода:

 timestamp=[];
 for j=1:length(data)
   timestamp = getfield(data,{j},'timestamp');
   timestamp{j}=(datetime);
end  

Но когда я смотрю на массив, кажется, что все значения являются одной датой, которой даже нет в массиве структуры "data".
Пример:

timestamp{1} = '14-Dec-2018 00:31:05';  
timestamp{10} = '14-Dec-2018 00:31:05';   
timestamp{19} = '14-Dec-2018 00:31:05'; 

Сначала я подумал, что это, вероятно, из-за формата ввода, поэтому я попытался

timestamp{j}=(datetime(timestamp,'InputFormat','uuuu-MM-dd''T''HH:mmXXX','TimeZone','UTC'));  

Но я получил сообщение: " Ошибка при использовании даты и времени(строка 635) Невозможно преобразовать '2016-06-03T13: 37: 20.315Z' в дату и время, используя формат 'uuuu-MM-dd'T'HH: mmXXX'."

Любые идеи?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Ваша индексация и преобразование типов немного сбивают с толку, смотрите мои комментарии ...

% Your code:
timestamp=[];                                     
for i=1:length(data)                              % Your loop variable is "i"
    % You override the entire "timestamp" array here, with element "j" not "i" of "data"
    % You also don't need to use getfield here
    timestamp = getfield(data,{j},'timestamp');  
    % You override element "j" (again, not "i") with the CURRENT datetime.
    % This line doesn't do any type conversion, "datetime" with no arguments is now!
    % Also you're using curly braces for indexing, which isn't right for a datetime array
    timestamp{j}=(datetime);
end 

Вы можете исправить это следующим образом:

timestamp = NaT(1,length(data)); % pre-allocate the output to "not a time" array
for ii = 1:length(data)
    t = getfield( data, {ii}, 'timestamp' );
    t( t == 'T' | t == 'Z' ) = []; % remove T and Z, they will break datetime
    timestamp( ii ) = datetime( t, 'InputFormat', 'yyyy-MM-ddHH:mm:ss.SSS' );
end

Вывод:

timestamp = 
 1×2 datetime array
 03-Jun-2016 13:37:20   03-Jun-2016 13:37:21

(Создано с использованием вашего примера строки и той же строки с добавлением одной секунды).


Вот как исправить ваш код, вот как я бы это сделал:

timestamp = regexprep( {data.timestamp}, '[TZ]', '' );
timestamp = datetime( timestamp, 'InputFormat', 'yyyy-MM-ddHH:mm:ss.SSS' );   
0 голосов
/ 14 декабря 2018

В вашем коде множество ошибок.Они суммированы ниже.

  1. Вы выполняете цикл, чтобы получить данные, хранящиеся в поле в данной структуре.Принимая во внимание, что вы можете напрямую получить все данные, хранящиеся в определенном поле в структуре, просто используя функцию getfield ().
  2. В цикле вы просто используете функцию datetime просто для заполнениявременная меткаВ результате каждый раз, когда вызывается datetime, он возвращает текущее время, следовательно, заполняя массив одинаковыми значениями в каждой позиции.
  3. Вы не можете напрямую преобразовать массив char даты со смещением TimeZone непосредственно в формат datetime.Сначала необходимо удалить смещения с помощью команды strrep ().

Решение проблемы

  1. Вы должны использовать функцию getfield дляполучить доступ к массиву временных меток из структуры данных в целом в одной строке без использования циклов.

-

Вы должны сначала удалить поля смещения (T и Z) из массива даты и

-

Наконец, вы должны преобразовать отредактированные строки даты и времени обратно в тип datetime , используя требуемый формат, который будет использоваться в сюжете.

Код, иллюстрирующий процедуру, приведен ниже.

% suppose we have a struct named data 
% with a field known as timestamp holding the
% different datetime char arrays of particular 
% TimeZone offsets
data.timestamp = {'2016-06-03T13:37:20.315Z', '2016-07-10T17:45:20.200Z', ...
                '2016-07-09T13:37:21.305Z', '2016-11-10T01:30:20.320Z'};

% now getting the timestamp field elements in a variable using getfield()
% command
timestamp = getfield(data, 'timestamp')

% now removing each offsets chars(T and Z) from each datetime strings
edited_timestamp = strrep(timestamp, 'T', ' '); % removing T
edited_timestamp = strrep(edited_timestamp, 'Z', '') % removing Z

% finally, convert the edited_timestamp back to datetime type using the
% required format to use in plot
timestamp_datetime = datetime(edited_timestamp, 'Format', 'yyyy-MM-dd HH:mm:ss.SSS')

% ------------------------------------------------------
% now you can do the plotting here using timestamp_datetime
% ------------------------------------------------------
% e.g., plot(timestamp_datetime, [1:4])

ВЫХОД

enter image description here

enter image description here

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