Неожиданное поведение функции datetick при построении октав - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь построить график, который отображает значения в зависимости от моментов времени.Для этого у меня есть массив моментов времени (в эпоху) и массив значений.

Я уже смог построить график в обычном режиме, используя необработанное время (как эпоха).Проблема, в частности, заключается в преобразовании формата времени оси.

hold on;
plot(horizontal, pre_X(:,4), 'b-');
xt = get(gca, 'xtick'); 
set(gca, 'xticklabel', sprintf('%d|', xt));
datetick ("x", "dd/mmm/YY HH:MM");
yt = get(gca, 'ytick'); 
set(gca, 'yticklabel', sprintf('%d|', yt));
hold off;

Предполагалось, что функция datetick сможет преобразовать эти времена эпохи в красиво отформатированные, но я не получаю ожидаемого результата.Вместо этого все моменты времени помечаются как одинаковые (01 / JAN / 00 00:00), что странно.

График без линии

datetick ("x", "dd/mmm/YY HH:MM");

работает нормально, но даетинформация о времени в эпоху, а это не то, что я намереваюсь.

Буду признателен за любую помощь!

ПРИМЕЧАНИЕ.Также, пожалуйста, дайте мне знать!Все, что мне нужно, - это правильно отформатировать ось X в удобочитаемое время.

1 Ответ

0 голосов
/ 27 сентября 2019

Не имея больше информации, я предполагаю, что под временем Epoch вы подразумеваете posix, или Unix time

Я бы ожидал, что он будет представлен в виде 32-разрядного целого числа., и должно быть числом секунд, отсчитываемым от «нулевого времени» (как описано в связанной вики) (оно также может быть числом с плавающей запятой, включая дробные секунды, используя ту же шкалу).

Согласно Справка Matlab для datetick , она ожидает, что данные оси будут «порядковыми номерами даты, возвращаемыми функцией datenum».Для совместимости, октава, вероятно, ожидает того же самого, хотя ссылка на функцию datetick не указывает это явно.

Формат datenum «серийный номер даты» - это другое последовательное представление времени, но он имеет другой масштаб и ссылку, чем время Epoch / posix / unix.В соответствии с описанием функции datenum , его последовательное определение - это «дата / время, введенные как серийный номер дня, с 1 января 0000, определенным как день 1».

Это длинный способ сказать, что ваше время, вероятно, выражено в единицах секунд, тогда как datenum ожидает единицы дней.

Теперь вы, вероятно, можете решить эту проблему несколькими способами.Вы можете преобразовать все свое время в масштаб datenum перед построением графика.из этого примера , что-то подобное будет работать в Matlab:

datetime(1470144960, 'convertfrom','posixtime')

Согласно ошибка # 47032 datetime еще не была реализована в Octave, но эта ошибкаВ отчете есть ссылка на репозиторий github с реализацией класса datetime (в папке inst /).

Чтобы вручную преобразовать время из unix в время matlab, вы можете выполнить следующий пример, используяследующий пример из обмена файлами Mathworks :

unix_epoch = datenum(1970,1,1,0,0,0);
matlab_time = unix_time./86400 + unix_epoch; 

(при условии, что ваши данные по оси x являются переменной unix_time)

Как только вы получите данные вшкала datenum, datetick должен работать правильно.

...