将毫秒转换为小时并绘制
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
.
我想,使用 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))
我会使用 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 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;
解释:
我们正在使用 colon (:) operator
创建一个规则间隔的向量 time_datenums = A:B:C
,其中 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
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.
这是输出:
我正在尝试转换一个毫秒数组及其各自的数据。但是我想在几小时和几分钟内完成。
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
.
我想,使用 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))
我会使用 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 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;
解释:
我们正在使用 colon (:) operator
创建一个规则间隔的向量 time_datenums = A:B:C
,其中 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
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.
这是输出: