对于时间序列图,如何将 x 轴设置为没有周末的日历时间

For a time series plot, how to set the x axis to calendar time without weekends

我想绘制时间序列(外汇期货合约的定价数据)。时间以 yyyymmdd HH:MM:SS 字符串格式给出。价格在 double.

时间序列跨越一周。但是,数据点的时间戳总是在工作日。 是否有内置方法来显示适当的 x 轴标签和缩放比例但没有周末?

我目前可以通过将字符串中的时间戳转换为 datenum and arrange x-axis automatically with datetick 来显示时间序列。但我想知道如何在 x 轴上排除周末。或者从没有数据的网格中排除任何延长的时间间隔。

有关视觉效果,请参阅末尾的示例。如果可以排除由于包括周末(4 月 10 日是美国假期)而导致的大空白 space,则通过关注实际有数据的地方,情节可以变得更加清晰。

数据点本身是工作日独有的。但是在 plotdatetick 之间,只要时间序列跨越一周,就会在周末创建网格点。 datetick 很有用,因为它会检测 x 轴网格的适当缩放比例,并一次性应用相应的网格标签。如果您将 datetick 视为解决方案的一部分,是否有办法在使用 datetick 后删除特定的网格点?

示例:

T=[7.378903958333334e+05;7.378967076388889e+05]; % converted from "20200409 09:30:00" and "20200415 16:59:00"
C=[0.7166;0.7090]; 

grid on
plot(T,C,'.')
xlim([min(T),max(T)])
datetick

如果您有兴趣修改相同的图,请通过 c&p 从 pastebin 将数据检索到 Matlab cmd 中。上面相同的行将产生以下情节。

没有这样的功能。可能是因为这本质上使 x 轴不连续,这(通常)是不可取的。

您将不得不创建一个合成的 x 轴来通过整理周末(或者更确切地说是非工作日)来实现这一点。 这是标准图(营业日为蓝色)

% create data
T = 7.3789e+05+(0:5:100)/10.';
C = rand(size(T)); 

% is a busniess day?
lg = isbusday(T);

% standard date plot
plot(T(lg),C(lg),'o', T(~lg),C(~lg),'o')
datetick('x','ddd')

现在让我们摆脱其他日子并手动设置 xTickLabel:

T = T(lg);
C = C(lg);
% plot without time-axis
plot(C,'o')

% --- get ticks
xTick = get(gca,'XTick');
% get which ticks are integers
lg = isreal(xTick) & rem(xTick,1)==0;
XTick_new = xTick(lg);
% --- create new tick label
xTickLbl_new_num = NaN(size(XTick_new));
% make sure they are within the limits
lg = XTick_new >= 1 & XTick_new <= length(T);
xTickLbl_new_num(lg) = T(XTick_new(lg));
% convert to string (arbitrary format)
xTickLbl_new_str = strings(size(xTickLbl_new_num));
xTickLbl_new_str(lg) = datestr(xTickLbl_new_num(lg),'ddd');
% set new label
set(gca,'XTick',XTick_new,'XTickLabel',xTickLbl_new_str);

看看结果:左边是标准版本,右边是手动设置刻度标签的版本。