Для графика временного ряда, как установить ось X на календарное время без выходных - PullRequest
2 голосов
/ 16 апреля 2020

Я хочу построить временной ряд (данные о ценах для форекс будущего контракта). Время указывается в yyyymmdd HH:MM:SS формате строки. Цена указана в double.

. Временные ряды охватывают неделю. Тем не менее, отметка времени для точек данных всегда в будние дни. Существует ли встроенный метод для отображения соответствующих меток и масштабирования по оси X, но без выходных?

В настоящее время я могу отображать временные ряды, преобразовав метку времени в строке в datenum и автоматически расположите ось x с помощью datetick. Но я хотел бы знать, как исключить выходные дни по оси X. Или исключите любой расширенный интервал времени из сетки, где нет данных.

Визуальный пример приведен в конце. Если можно исключить большое пустое пространство из-за включения выходных (10 апреля было выходным днем ​​в США), сюжет может стать более разборчивым, если сосредоточиться на том, где фактически находятся данные.

Сами точки данных являются исключительными для будни. Но между plot и datetick точки сетки в выходные дни создаются всякий раз, когда временной ряд охватывает более недели. datetick полезен, потому что он определяет соответствующее масштабирование для сетки по оси X и применяет соответствующие метки сетки в одном go. Если вы видите 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 в Matlab cmd из pastebin . Те же строки выше приведут к следующему графику.

Example

1 Ответ

1 голос
/ 16 апреля 2020

Нет таких функций. Вероятно, потому что это по существу делает ось X прерывистой, что (обычно) нежелательно.

Вам нужно будет создать синтетическую c ось 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);

Посмотрите по результатам: слева стандартная версия и справа версия с вручную установленными галочками. comparison

...