将毫秒转换为小时并绘制

Convert milliseconds into hours and plot

我正在尝试转换一个毫秒数组及其各自的数据。但是我想在几小时和几分钟内完成。

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

我已将其设置为每分钟记录一次数据,因此 60000 millis(= 1 分钟)。我正在尝试在 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.

我想,使用 datetickdatenum 有更简单的方法,但我想不出来。这应该可以暂时解决您的问题:

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))

我会使用 datenums:

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

在这种情况下,最好使用 datenum values and then use datetickplot 的刻度标签格式设置为 '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;

解释:

我们正在使用 colon (:) operator 创建一个规则间隔的向量 time_datenums = A:B:C,其中 A 是起始 datenum 值,B 是增量datenum 值和 C 之间是结束 datenum 值。

由于您每分钟(60000 毫秒)进行一次测量,因此 datenum 值之间的增量也应为 1 分钟。因为一天有 24 小时,所以一天有 1440 分钟,所以使用 B = 1/1440 作为向量元素之间的增量,以获得 1 分钟的增量。

对于 AC 我们只需要将小时数字除以 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 function at all, and still, it manages to generate a valid array of datenum values only taking into consideration the time of the datenum, without needing to bother about the date of the datenum. You can learn more about this here and


回到你原来的问题,我们来看一下代码:

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.

这是输出: