Преобразование миллисекунд в часы и построение графика

Я пытаюсь преобразовать массив миллисекунд и соответствующие данные. Однако я хочу сделать это в часах и минутах.

Millis = [60000 120000 180000 240000....]
Power = [ 12 14 12 13 14 ...]

Я настроил так, что данные записываются каждую минуту, следовательно, 60000 millis (= 1 minimte). Я пытаюсь отобразить время на оси x и включить y. Я хотел бы, чтобы ось x отображалась в часах и минутах с каждыми соответствующими данными о мощности, соответствующими соответствующему времени.

я пробовал это

for i=2:length(Millis)
Conv2Min(i) = Millis(i) / 60000;
Time(i) = startTime + Conv2Min(i);
if (Time(i-1) > Time(i) + 60)
Time(i) + 100;
end

end
s = num2str(Time);

Это попытка превратить миллисекунды в часы, начиная с 08:00, и когда 60 минут проходят до 09:00, проблема заключается в построении графика. У меня есть промежуток между 08:59 и 09:00. Я также не могу поддерживать 0=initial 0.


person Jayden Robert Hasemann    schedule 01.05.2017    source источник
comment
Пожалуйста, обратите внимание, что в английском языке только имена и слова пишутся с большой буквы (и первое слово предложения, очевидно), так что ровно наоборот от того, что вы написали.   -  person Adriaan    schedule 01.05.2017


Ответы (3)


В этом сценарии предпочтительнее работать со значениями datenum, а затем использовать datetick, чтобы установить формат меток делений от plot до 'HH:MM'.

Предположим, вы начали проводить измерения в t_1 = [HH_1, MM_1] и прекратили измерения в t_2 = [HH_2, MM_2].

Крутой трюк для создания массива значений datenum заключается в использовании следующего выражения:

time_datenums = HH_1/24 + MM_1/1440 : 1/1440 : HH_2/24 + MM_2/1440;

Объяснение:

Мы создаем регулярно расположенный вектор time_datenums = A:B:C, используя colon (:) operator, где A начальное значение datenum, B — это приращение между datenum значениями, а C — конечное значение datenum.

Поскольку ваши измерения проводились каждую минуту (60000 миллисекунд), то приращение между datenum значениями также должно составлять 1 минуту. Поскольку в сутках 24 часа, это составляет 1440 минут в день, поэтому используйте B = 1/1440 в качестве приращения между элементами вектора, чтобы получить приращение в 1 минуту.

Для A и C нам просто нужно разделить цифры часов на 24 и цифры минут на 1440 и просуммировать их следующим образом:

  • A = HH_1/24 + MM_1/1440
  • C = HH_2/24 + MM_2/1440

Так например, если t_1 = [08, 00], то A = 08/24 + 00/1440. Так просто, как, что.

Обратите внимание, что эта процедура вообще не использует функцию datenum, и все же , ему удается сгенерировать действительный массив значений datenum, только принимая во внимание время datenum, не беспокоясь о дате datenum. Вы можете узнать больше об этом здесь и здесь.


Возвращаясь к исходной проблеме, давайте посмотрим на код:

time_millisec = 0:60000:9e6;             % Time array in milliseconds.
power = 10*rand(size(time_millisec));    % Random power data.

% Elapsed time in milliseconds.
elapsed_millisec = time_millisec(end) - time_millisec(1); 
% Integer part of elapsed hours.
elapsed_hours_int = fix(elapsed_millisec/(1000*60*60));
% Fractional part of elapsed hours.
elapsed_hours_frac = (elapsed_millisec/(1000*60*60)) - elapsed_hours_int;

t_1 = [08, 00]; % Start time 08:00
t_2 = [t_1(1) + elapsed_hours_int, t_1(2) + elapsed_hours_frac*60]; % Compute End time.

HH_1 = t_1(1); % Hour digits of t_1
MM_1 = t_1(2); % Minute digits of t_1

HH_2 = t_2(1); % Hour digits of t_2
MM_2 = t_2(2); % Minute digits of t_2

time_datenums = HH_1/24+MM_1/1440:1/1440:HH_2/24+MM_2/1440; % Array of datenums.

plot(time_datenums, power);    % Plot data.
datetick('x', 'HH:MM');        % Set 'HH:MM' datetick format for the x axis.

Это результат:

график с отметками даты в формате 'ЧЧ:ММ?'></a></p><div style=

person codeaviator    schedule 01.05.2017
comment
Как упоминалось в моем ответе, вы можете использовать сам datenum для преобразования матрицы Mx6 в datenum. Не нужно конструировать их самостоятельно. Секунды автоматически переходят в минуты, часы, дни. - person Gelliant; 01.05.2017
comment
@Gelliant Пожалуйста, прочитайте мой ответ и поймите, что мой подход сильно отличается от вашего. Спасибо за ваш вклад. Ваше здоровье. - person codeaviator; 01.05.2017
comment
да я вижу. Вы немного добавили сверху. Подход немного отличается, но не соответствует заданному вопросу. У него есть массив времени в миллисекундах, вы берете первое и последнее и создаете массив даты. - person Gelliant; 01.05.2017
comment
@Gelliant Извините, что не согласен. Этот подход полностью действителен, поскольку OP регулярно проводит измерения каждую минуту: Я настроил его таким образом, что данные записываются каждую минуту. Таким образом, временной массив в этой задаче растет с постоянной скоростью 60 000 миллисекунд, поэтому использования времени начала и прошедшего времени более чем достаточно. Кстати, массив time в моем коде — это массив таймингов в миллисекундах, на случай, если вы его пропустили. - person codeaviator; 01.05.2017
comment
Если заменить в моем ответе d = [2017 05 01 08 00 00]; при d = [0 0 0 8 0 0]; вы бы сгенерировали точно такие же даты с моим кодом. Извините, что не согласен, я действительно не вижу большой разницы в наших методах и не вижу никаких преимуществ в использовании ваших. - person Gelliant; 01.05.2017
comment
@Gelliant Большая разница в том, что я генерирую значения datenum вручную, даже не используя функцию datenum. - person codeaviator; 01.05.2017
comment
Большое спасибо, это именно то, что я искал :) - person Jayden Robert Hasemann; 02.05.2017

Я бы использовал даты:

Millis = [60000 120000 180000 240000 360000];
Power = [ 12 14 12 13 14 ];
d = [2017 05 01 08 00 00]; %starting point (y,m,d,h,m,s)
d = repmat(d,[length(Millis),1]);
d(:,6)=Millis/1000; %add them as seconds
D=datenum(d); %convert to datenums
plot(D,Power) %plot
datetick('x','HH:MM') %set the x-axis to datenums with HH:MM as format

еще более короткий подход: (спасибо codeaviator за идею)

Millis = [60000 120000 180000 240000 360000];
Power = [ 12 14 12 13 14 ];
D = 8/24+Millis/86400000; %24h / day, 86400000ms / day
plot(D,Power) %plot
datetick('x','HH:MM') %set the x-axis to datenums with HH:MM as format
person Gelliant    schedule 01.05.2017

Я думаю, есть более простой способ, используя datetick и datenum, но я не мог его понять. Это должно решить вашу проблему на данный момент:

Millis=6e4:6e4:6e6;
power=randi([5 15],1,numel(Millis));
hours=floor(Millis/(6e4*60))+8; minutes=mod(Millis,(6e4*60))/6e4; % Calculate the hours and minutes of your Millisecond vector.
plot(Millis,power)
xlabels=arrayfun(@(x,y) sprintf('%d:%d',x,y),hours,minutes,'UniformOutput',0); % Create time-strings of the format HH:MM for your XTickLabels
tickDist=10; % define how often you want your XTicks (e.g. 1 if you want the ticks every minute)
set(gca,'XTick',Millis(tickDist:tickDist:end),'XTickLabel',xlabels(tickDist:tickDist:end))
person Max    schedule 01.05.2017