Octave中的datenum问题

时间:2015-07-10 17:50:07

标签: octave

我试图使用datetick函数绘制一些数据,首先使用datenum来解析一些数据。以下是我试图阅读的一些数据:

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

我可以通过使用以下内容从时间和上午/下午分离月/日/年来获得日期部分工作:

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数。所以语法看起来还不错,直到我一起尝试它们。

1 个答案:

答案 0 :(得分:2)

代码有两个问题。

首先,您的格式字符串与列数不匹配。你需要额外的%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就会出现错误。 E.g:

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

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

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

更新:上述错误已修补并关闭。超过4.0.1的Octave版本将不再出现此问题。