#matlab #datetime #date #utc
#matlab #дата и время #Дата #utc
Вопрос:
У меня есть набор дат, выраженных в виде 2010-07-31T23:01:57Z
. Мне нужно преобразовать его в вектор. Я мог бы сделать это, поскольку datavec(mydate)
он автоматически преобразует строку в вектор, но эта функция не принимает дату строки UTC. Итак, я грубо решил таким образом:
a = `2010-07-31T23:01:57Z`; %UTC date format
a(20) = ''; %remove Z
a(11) = ' '; %replace T with a space
a = datavec(a); % [2010, 7, 31, 23, 1, 57]
Таким образом a
, это datevector, который я могу использовать etime(T1, T0)
для вычисления разницы во времени между T1
и T0
. Это уникальный способ или я могу сделать что-то стильное?
Ответ №1:
Как предлагает Марк, все, что вам нужно сделать, это немного «помочь» MATLAB, указав формат данных.
datevec('2010-07-31T23:01:57Z','yyyy-mm-ddTHH:MM:SS')
должно сработать.
Ответ №2:
используйте fieldSpecIn
часть datevec()
вызова. Прочитайте все об этом здесь: http://www.mathworks.com/help/techdoc/matlab_prog/bspgcx2-1.html#bspgc4m-1
За исключением спецификации TZ в конце вашей строки и -‘s и :’s, ваш формат идентичен стандартному формату ISO 8601. Вы можете либо изменить свою, либо создать свою собственную строку спецификации.
Пожалуйста, обратите внимание, что Matlab time не имеет понятия часового пояса. Вы должны отслеживать это самостоятельно.
Комментарии:
1. Обновление — datenums matlab не имеют понятия TZ, но новый тип datetime имеет: mathworks.com/help/matlab/ref/datetime.html
Ответ №3:
Как указывалось другими, вы можете указать формат строк ожидаемой даты для таких функций, как DATEVEC и DATENUM. Пример:
%# set of dates and an initial date
T0 = '2010-01-01T00:00:00Z';
T = repmat({'2010-07-31T23:01:57Z'}, [10 1]); %# cell array
%# format of datetime
frmt = 'yyyy-mm-ddTHH:MM:SS';
%# convert to serial date numbers, and compute difference between all T and T0
n = datenum(T,frmt);
n0 = datenum(T0,frmt);
tdiff = bsxfun(@minus, n, n0);
Кроме того, если у вас необычный формат даты, вы всегда можете разделить и проанализировать его самостоятельно с помощью таких функций, как TEXTSCAN:
vec = zeros(numel(T),6);
for i=1:numel(T)
C = textscan(T{i}, '%f', 'Delimiter',['-' ':' 'T' 'Z']);
vec(i,:) = C{1};
end
n = datenum(vec);
Обратите внимание, что в обоих случаях вы можете преобразовать последовательное время обратно в строки даты с помощью функции DATESTR.