2

我被困在尝试使用 MATLAB 运行经济模型 - 在数据导入部分。对于我的大部分代码,我使用的是一个名为 IRIS 的免费软件工具箱。

我有包含 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
4

1 回答 1

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

请注意,在代码的最后一行中,我们如何将日期列转换为序列日期编号,以便我们可以将整个数据存储在一个数字矩阵中。您始终可以使用 DATESTR 函数返回日期的字符串表示形式:

>> datestr(data(:,1))
ans =
01-Apr-1970
01-Jul-1970
01-Oct-1970
01-Jan-1971
于 2012-07-25T23:52:30.107 回答