2012-07-25 300 views
2

我被困在試圖運行使用MATLAB的經濟模型 - 在數據導入部分。對於我的大部分代碼,我使用的是名爲IRIS的免費工具箱。將時間序列數據集導入MATLAB(所有值都顯示爲NaN)

我有季度數據集有14個變量和160個數據點。本質上數據集是一個15X161矩陣 - 包括日期(col1)和變量名稱(B1:O1)。

用於在IRIS上傳數據的命令是

d = dbload('filename.csv') 

,但是這是行不通的。儘管MATLAB正在創建一個名爲d的1X1數組,並在其下創建字段(每個變量都有一個字段)。所有單元顯示NaN - 不是數字。

這是怎麼發生的?

我檢查了IRIS工具箱網站上的教程,並嘗試使用此命令運行並加載示例數據集,但它導致相同的問題。在我檢查的任何地方 - 包括MATLAB幫助,這似乎是使用IRIS時使用的正確命令,但它在某種程度上不起作用。

我也嘗試直接使用MATLAB函數上傳數據,而不是IRIS。我使用的命令是:

d = dataset('XLSFile','filename.xls','ReadVarNames', true). 

雖然這是行得通的,我可以看到所有的變量名,但MATLAB無法讀取日期。我也嘗試了xlsread和importdata,但他們不讀取變量名稱。有沒有辦法讓我用變量名和日期上傳整個Excel工作表?

這將是最好的,如果我能得到IRIS命令的工作,因爲我的代碼的其餘部分將與此兼容。

數據集看起來有點像這個..

HO_GDP  HO_CPI HO_CPI HO_RS HO_ER HO_POIL.... 
4/1/1970 82.33 85.01 55.00 99.87 08.77 
7/1/1970 54.22  8.98 25.22 95.11 91.77 
10/1/1970 85.41 85.00 85.22 95.34 55.00 
1/1/1971 85.99 899  8.89 85.1 
+0

您可以發佈部分實際CSV數據(標題加一行或兩行)。基本上我試圖看看文件有什麼分隔符(我懷疑是逗號),每列的類型是什麼。從上面可以看出,第一列是日期,其餘是數字數據。這是所有列的情況嗎?我應該說我對[IRIS]沒有經驗(http://code.google.com/p/iris-toolbox-project/)。我以前從未使用過 – Amro 2012-07-25 21:48:20

+0

以上數據來自實際的CSV本身。你是正確的,第一列是日期,其餘14是數值。第一行是由諸如HO_GDP,HO_CPI等值組成的頭部。之後是如上所示的實際數據。數據有時會上升到小數點後5位。 – S1234 2012-07-25 23:04:01

回答

0

可以使用TEXTSCAN函數讀取MATLAB中的CSV文件:

%# some options 
numCols = 15;  %# number of columns 
opts = {'Delimiter',',', 'MultipleDelimsAsOne',true, 'CollectOutput',true}; 

%# open file for reading 
fid = fopen('filename.csv','rt'); 

%# read header line 
headers = textscan(fid, repmat('%s',1,numCols), 1, opts{:}); 

%# read rest of data rows 
%# 1st column as string, the other 14 as floating point 
data = textscan(fid, ['%s' repmat('%f',1,numCols-1)], opts{:}); 

%# close file 
fclose(fid); 

%# collect data 
headers = headers{1}; 
data = [datenum(data{1},'mm/dd/yyyy') data{2}]; 

爲您發佈上述樣品的結果(假設值爲逗號分隔):

>> headers 
headers = 
    'HO_GDP' 'HO_CPI' 'HO_CPI' 'HO_RS' 'HO_ER' 'HO_POIL' 
>> data 
data = 
    7.1962e+05  82.33  85.01   55  99.87   8.77 
    7.1971e+05  54.22   8.98  25.22  95.11  91.77 
    7.198e+05  85.41   85  85.22  95.34   55 
    7.1989e+05  85.99   899   8.89   85.1   0 

注意如何在c的最後一行我們將日期列轉換爲serial date number,以便我們可以將整個數據存儲在一個數字矩陣中。您始終可以使用DATESTR函數返回日期的字符串表示形式:

>> datestr(data(:,1)) 
ans = 
01-Apr-1970 
01-Jul-1970 
01-Oct-1970 
01-Jan-1971 
+0

我試着運行你的代碼,但它拋出一個錯誤:使用datenum錯誤(179行) DATENUM失敗。 原因: 使用dtstr2dtnummx時出錯 將日期字符串轉換爲日期...號碼失敗。我設法使用這個命令上傳excel文件:d = dataset('XLSFile','filename.xls','ReadVarNames',true)但是,數據顏色以excel文本格式顯示。我怎樣才能將這個列轉換回日期格式?感謝您的幫助! – S1234 2012-07-26 06:45:30

+0

@ S1234:上面的代碼對您發佈的數據樣本正常工作。現在,我很難猜測看到您的實際文件有什麼問題......如果它沒有包含任何敏感數據,請考慮在線上傳您的文件,以便我們查看它(想想Dropbox或任何其他類似的網站) – Amro 2012-07-26 16:16:16