2015-07-10 50 views
3

我想通過先使用datenum解析某些數據來使用datetick函數繪製一些數據。下面是一些數據,我想讀:在octave中遇到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 

我可以得到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') 

它給了我一個7xxxxx數字爲每行m,n和o。所以語法看起來不錯,直到我一起嘗試它們。

回答

2

代碼的兩個問題。

首先,您的格式字符串與列數不匹配。那裏需要額外的%f。既然這樣,你的代碼產生:

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

那麼,第一個定位是一個額外的%f添加到textread格式字符串:

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,它可以工作。

更新:上述錯誤已修補並關閉。超過4.0.1的八度版本不再有這個問題。