datetime matlab不同的时间分辨率

datetime matlab different temporal resolution

我想在一张图中绘制两个时间序列。不幸的是,数据集具有不同的时间分辨率,我使用 datetime 的代码不起作用。我的目标是每小时一个 xtick。知道我该如何解决这个问题吗?谢谢!

dataset1 = rand(1,230).';
dataset2 = rand(1,33).';

xstart = datenum('19/02 09:00','dd/mm HH:MM');
xend = datenum('21/02 18:00','dd/mm HH:MM');
x = linspace(xstart,xend,20);
Dat = linspace(xstart,xend,numel(dataset1));
x1=[1:1:230].' %values every 15 minutes


x0_OM = datenum('19/02 09:00','dd/mm HH:MM');
x1_OM = datenum('20/02 18:00','dd/mm HH:MM');
xData = linspace(x0_OM,x1_OM,20);
Dat2 = linspace(xstart,xend,numel(dataset2));
x2=[1:4:130].' %hourly values


fig=figure ();

yyaxis left
plot(x1,dataset1);
ylabel('Dataset 1')
xlabel('timesteps (15min Interval)');
yyaxis right
plot(x2,dataset2);
ylabel('Dataset 2')
set(gca,'XTick', xData) %does not work
datetick('x', 'dd/mm HH:MM', 'keeplimits','keepticks') %does not work

最后两个命令确实有效,但不幸的是,刻度线只是在图表之外的另一个地方。您的 x1(和 x2)值在 1 到 230 之间,而刻度线的 xData 值在 730000 左右。如果您在 datenum 值处选择绘图的 x 值,它会起作用.
另一个问题是向量的长度不会每 15 分钟(或 1 小时)加起来等于一个值。如果您想要从 19/02 09:00 到 21/02 18:00(总共 57 小时)的时间跨度每 15 分钟的值,您需要:

4(1/h)*57(小时) + 1 最后一个值 = 229 个值

或者一般来说:

(时间跨度/时间窗口) + 1

如果您将这些更改应用于您的代码,您将获得

dataset1 = rand(1,229).';
dataset2 = rand(1,34).';

xstart = datenum('19/02 09:00','dd/mm HH:MM');
xend = datenum('21/02 18:00','dd/mm HH:MM');

% in datenumformat 1 = 24 hours
fifteenminutes=(1/24/4);%15 minutes
spacing_in_15min=((xend-xstart)/fifteenminutes)+1;%duration devided by timewindow, +1 for last value
x1 = linspace(xstart,xend,spacing_in_15min); %values every 15 minutes

x0_OM = datenum('19/02 09:00','dd/mm HH:MM');
x1_OM = datenum('20/02 18:00','dd/mm HH:MM');
onehour=1/24; %one hoour
spacing_in_1hour=((x1_OM-x0_OM)/onehour)+1;%duration devided by timewindow, +1 for last value
x2 = linspace(x0_OM,x1_OM,spacing_in_1hour); %hourly values
tickvalues = linspace(xstart,xend,((xend-xstart)/onehour)+1);

fig=figure ();

yyaxis left
plot(x1,dataset1);
ylabel('Dataset 1')
xlabel('timesteps (15min Interval)');
yyaxis right
plot(x2,dataset2);
ylabel('Dataset 2')
set(gca(1),'XTick', tickvalues); %Ticks every hour for the larger dataset
set(gca(1),'XLim', [x2(1) x2(end)]); %focus on the time with both datasets
datetick('x', 'dd/mm HH:MM', 'keeplimits','keepticks'); %Tickformat

我想这就是您要找的。我删除了一些未使用的值 (xDatxData)。不幸的是,即使在全屏模式下,34 个 Tick 值也很多,因此您可能想要更改 Tickformat 或放大特殊部分。 如果你必须在这方面做更多的工作,我建议你研究一下 MATLAB datetime 格式,我发现它比 datenum.

更好处理。

我对您的代码进行了一些概括,并使用了比随机数更好的检查方式。我删除了标签部分以保持脚本简短。

% Dataset 1, 15 minutes interval
xstart1 = datenum('19/02 09:00','dd/mm HH:MM');
xend1 = datenum('21/02 18:00','dd/mm HH:MM');
Dat1 = xstart1:1/24/4:xend1;                           % 1/24/4 is a 15 minutes step
dataset1 = sin(linspace(0, 2*pi, numel(Dat1)));

% Dataset 2, 1 hour interval
xstart2 = datenum('19/02 09:00', 'dd/mm HH:MM');
xend2 = datenum('20/02 18:00', 'dd/mm HH:MM');
Dat2 = xstart2:1/24:xend2;                             % 1/24 is a 1 hour step 
dataset2 = cos(linspace(0, 2*pi, numel(Dat2)));

% Determine "global" start and end.
xstart = min(xstart1, xstart2);
xend = max(xend1, xend2);
Dat = xstart:1/24:xend;

% Plot
fig = figure();
hold on;
plot(Dat1, dataset1, '*');
plot(Dat2, dataset2, 'r*');
set(gca, 'XTick', Dat);
datetick('x', 'dd/mm HH:MM', 'keepticks', 'keeplimits');
hold off;

原则上,这应该可行,但由于刻度标签较长,输出效果不佳。您能否检查一下,如果是,您想要实现什么?