【问题标题】:How do I format X Axis tick labels when using Epoch seconds as X axis values?使用 Epoch 秒作为 X 轴值时,如何格式化 X 轴刻度标签?
【发布时间】:2020-08-20 14:41:07
【问题描述】:

我有以下数据集:

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')

但结果是这样的:

我想了解如何显示年份 (YYYY) 和年份和月份 (YY-MM)。我不确定 Matlab 解决方案是否也适用于 Octave。

【问题讨论】:

  • 在 MATLAB 中,只使用 datetime(...'convertFrom'...,'Format','yyyy') 但我猜在 Octave 中没有 datetime 数据类型。使用模运算符从 unix 时间中提取年份怎么样?

标签: matlab octave axis-labels


【解决方案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 以来的小数天数,无论这意味着什么)。

您可以做的是使用您的值通过 datevec 转换为 datenums。例如。您的第一个值,即 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 中的工作方式相同。

【讨论】:

  • 注意:对于上面提供的范围,年份和月份不会改变,因为提供的时期都只有几天的间隔。
  • 非常感谢您花时间解释这一点,这对我来说是一个真正的问题,因为我几乎总是处理 UNIX 纪元时间戳来分析和显示数据,这让我抓狂。起初我对 Octave 不处理 UNIX Epoch 时间这一事实感到震惊,但如果你三思而后行,为什么要将时间序列限制在 1970 年?不过,我认为 Octave 文档中处理 UNIX 纪元时间的特定章节会很棒,因为它们被广泛用于许多应用程序中。
  • @M.E. octave 实际上还提供了一个稍旧且完全独立的基于“TM_STRUCT”的日期时间机制,它更面向 unix-epoch,并提供 strftime 和 strptime 函数(您可能对 python 很熟悉)。等效的语法是,例如strftime( "%Y", localtime(1420174800) )。但是,这种方法与 matlab 不兼容。
  • @M.E.对,就是这样。 tm_struct 实际上是 c 日期/时间函数的接口,位于 matlab 函数 (afaik) 之前。然后是matlab引入了datenum/datevector族,为了兼容,用octave复现,这就是两组函数不同的原因。正如其他人已经在这里指出的那样,matlab 现在也有一个面向对象的日期时间类(尚未以 octave 复制)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2014-10-07
  • 2016-08-31
相关资源
最近更新 更多