Как мне форматировать метки отсчетов по оси X при использовании секунд эпохи в качестве значений по оси X?

#matlab #octave #axis-labels

#matlab #октава #метки оси

Вопрос:

У меня есть следующий набор данных:

 octave:42> yy
yy =

   1420174800.00000           21.70000           21.93000           21.64000           21.81000      1949882.00000
   1420434000.00000           21.92000           22.23000           21.90900           22.17000      3189214.00000
   1420520400.00000           22.15000           22.51000           22.08000           22.41000      4810496.00000
   1420606800.00000           22.21000           22.27500           22.07000           22.11000      2397372.00000
   1420693200.00000           21.93000           21.93600           21.70000           21.73000      2797149.00000
   1420779600.00000           21.68000           21.98000           21.68000           21.90000      2377333.00000
   1421038800.00000           21.88000           22.15000           21.87000           22.07000      2347871.00000
   1421125200.00000           21.94000           22.30000           21.76500           22.15000      5255049.00000
   1421211600.00000           22.40000           22.51900           22.24000           22.25000      5843980.00000
   1421298000.00000           22.18000           22.48000           22.14000           22.47990      3498303.00000
  

Если я построю его, я получу следующую диаграмму:

 octave:44> plot(yy(:,1), yy(:,5))
  

Диаграмма

Следуя документации Octave (https://octave.sourceforge.io/octave/function/datetick.html ) Я попробовал следующее, чтобы отобразить годы вместо значений секунд эпохи UNIX.

 octave:48> plot(yy(:,1), yy(:,5))
octave:49> datetick('x','YYYY')
  

Но это результат:

введите описание изображения здесь

Я хотел бы узнать, как отображать ГОД (ГГГГ), а также год и месяц (ГГГГ-ММ). Я не уверен, что решение Matlab также может поместиться в Octave.

Комментарии:

1. В MATLAB просто используйте, datetime(...'convertFrom'...,'Format','yyyy') но я предполагаю, что в Octave нет datetime типа данных. Как насчет использования оператора modulo для извлечения лет из времени unix?

Ответ №1:

Краткая версия

 plot( arrayfun( @(x) datenum([1970, 1, 1, 0, 0, x]), yy(:,1) ), yy(:,5) )
datetick( 'x', 'yyyy' )
  

Объяснение

Числа, которые у вас есть, относятся к эпохам unix (т. Е. секундам с 1970-1-1 00:00:00 UTC). Причина, по которой вы получаете странные числа из datetick, заключается в том, что в качестве входных данных ожидаются не эпохи unix, а «номера дат» (дробное число дней с 0000-1-0 00:00: 00 UTC, что бы это ни значило).

Что вы можете сделать, так это использовать ваши значения для преобразования в datenums через datevec. Например. ваше первое значение, т. е. 1420174800, может быть преобразовано в datenum следующим образом

 datenum([1970,1,1,0,0,1420174800])   % i.e. the 1420174800th second of 1970-01-01 
% ans = 7.3597e 05

datestr( datenum([1970,1,1,0,0,1420174800]), 0 )
% ans = 02-Jan-2015 05:00:00
  

Таким образом, вы могли бы преобразовать все ваши эпохи unix в datenums, например, вот так

 DateNums = arrayfun( @(x) datenum([1970, 1, 1, 0, 0, x]), yy(:,1) )
  

А затем построить график, используя вместо этого значения DateNums, и использовать datetick, как ожидалось.

Вышеупомянутое решение будет работать одинаково в octave и matlab.

Комментарии:

1. Примечание: для приведенного выше диапазона год и месяц не меняются, поскольку все указанные эпохи отличаются друг от друга всего на пару дней.

2. Большое спасибо, что уделили время на объяснение этого, для меня это было реальной проблемой, поскольку я почти всегда имею дело с метками времени эпохи UNIX для анализа и отображения данных, и это сводило меня с ума. Сначала я был шокирован тем фактом, что Octave не обрабатывает времена эпохи UNIX, но если подумать дважды, почему временные ряды должны быть ограничены 1970 годом? Я думаю, однако, что отдельная глава в документации Octave, посвященная эпохальным временам UNIX, была бы отличной, поскольку они широко используются во многих приложениях.

3. @M.E. octave на самом деле также предоставляет немного более старый и полностью отдельный механизм datetime, основанный на «TM_STRUCT», который больше ориентирован на эпоху unix, и предоставляет функции strftime и strptime (которые вы, возможно, знакомы с python). Эквивалентный синтаксис был бы, например strftime( "%Y", localtime(1420174800) ) . Однако этот подход не совместим с matlab.

4. смотрите: octave.org/doc/v5.2.0/Timing-Utilities.html#Timing-Utilities

5. @M.E. Точно да. tm_struct фактически является интерфейсом к функциям даты и времени c и предшествует функциям matlab (afaik). Затем семейство datenum / datevector было введено matlab и воспроизведено в octave для совместимости, поэтому два набора функций различны. Как кто-то уже отмечал здесь, в matlab теперь также есть объектно-ориентированный класс datetime (который еще не был воспроизведен в octave).