Octave 中的 datenum 问题

Trouble with datenum in Octave

我试图通过首先使用 datenum 解析一些数据来使用 datetick 函数绘制一些数据。这是我尝试读取的一些数据:

0, 6/23/2015 12:21:590 PM, 93.161, 95.911,94.515,95.917,        -5511.105,94.324,-1415.849,2.376,2.479
1, 6/23/2015 12:22:02 PM, 97.514, 96.068,94.727,96.138,-12500.000,94.540,-8094.912,2.386,2.479

我试试下面的代码:

fileID = fopen('070915.csv');
C = textscan(fileID,'%f %s %f %f %f %f %f %f %f %f','Delimiter',',','headerLines', 9);
fclose(fileID);
formatIn = 'mm/dd/yyyy HH:MM:SS.FFF PM';
m = datenum(C{2},formatIn)
figure('Position',[0,0,1000,1000])
h1 = plot(m,C{5},'b');
datetick (formatIn);

我收到以下错误:

error: datevec: DATE not parsed correctly with given format
error: called from
datevec at line 147 column 11
datenum at line 104 column 40
plotwithdate at line 18 column 3

我可以通过使用以下方法将 month/day/year 与时间和 AM/PM 分开来使 datenum 部分工作:

fileID = fopen('070915.csv');
C = textscan(fileID,'%f %s %s %s %f %f %f %f %f %f %f %f','Delimiter',', ','headerLines', 9);
fclose(fileID);
m = datenum(C{2},'mm/dd/yyyy')
n = datenum(C{3},'HH:MM:SS.FFF')
o = datenum(C{4},'AM')

这为我提供了 m、n 和 o 的每一行的 7xxxxx 数字。所以语法看起来没问题,直到我一起尝试它们。

代码有两个问题。

首先,您的格式字符串与列数不匹配。你需要一个额外的 %f 在那里。就目前而言,您的代码会产生:

C{2}
ans = 
{
   [1,1] = 6/23/2015 12:21:590 PM
   [2,1] = 1
   [3,1] = 2.479
}

因此,第一个解决方法是向 textread 格式字符串添加一个额外的 %f

C = textscan(fileID,'%f %s %f %f %f %f %f %f %f %f %f','Delimiter',',','headerLines', 9);

产生:

C{2}
ans = 
{
   [1,1] = 6/23/2015 12:21:590 PM
   [2,1] = 6/23/2015 12:22:02 PM
}

现在,接下来您会注意到 12:21:590 是错误的。我假设这只是您示例中的错字。但是设置为 12:21:59 仍然存在问题。

您指定了一种包含小数秒的格式,但您的数据不包含小数秒。 Octave 会因此抛出错误。如果您指定 .FFF,您的数据需要包含它,即使它只是 .0.

最后,Octave 仍然会抛出错误,即使您将小数秒添加到数据中也是如此。然而,这不是你的错。每当 .FFFPM 符号一起使用时,Octave 中似乎存在错误。例如:

>> datevec('06/01/2015 3:07:12 PM','mm/dd/yyyy HH:MM:SS PM')
ans =

   2015      6      1     15      7     12

>> datevec('06/01/2015 3:07:12.123','mm/dd/yyyy HH:MM:SS.FFF')
ans =

   2015.0000      6.0000      1.0000      3.0000      7.0000     12.1230

>> datevec('06/01/2015 3:07:12.123 PM','mm/dd/yyyy HH:MM:SS.FFF PM')
error: datevec: DATE not parsed correctly with given format
error: called from
    datevec at line 147 column 11

Octave 的 bug report 中涵盖了此问题。当前有一个更正版本的函数 datevec.m 文件附加到该错误报告。根据该页面上的信息,更正后的功能将成为 Octave 4.0.1 发布时的一部分。同时,您可以下载并使用更正后的版本来正确处理您的数据。

或者,如果您可以控制源数据格式,则可以删除 .FFF 指示符(看起来您的数据可能根本不需要它),或者删除 PM,以及它会起作用。

更新:上述错误已修复并关闭。 Octave 4.0.1以后的版本应该不会再有这个问题了。