0

在问我的问题之前,这里有一点背景,所以你明白我在做什么。我正在寻找分析一个非常大的数据集(略少于 2,000,000 行)。我已经将数据集解析到 Matlab 中,并根据这些数据构建了一个结构数组,为每个资产 i 提供名称、日期、回报等。现在,我想将我的数据集限制在两天之间,而 Matlab 似乎并不特别适合这种方法。给我的一个建议是获取格式为 MM/DD/YYYY 的日期并使用分隔符“/”以某种方式为我的数据结构构建三个整数数组(我称之为 stock(i) .month、stock(i).day 和 stock(i).year)。但是,我所做的一切似乎都不起作用,而且我非常卡住。

我一直在尝试做的事情如下:

%% Dates
fid = fopen('52c6d3831952b24a.csv');
C = textscan(fid, [repmat('%*s ',1,0),'%s %*[^\n]'], 'delimiter',',');
date = C{1}(2:end,1);
fclose(fid);

for i=1:numStock
    locate = strcmp(uniquePermno{i},permno);
    stock(i+1).date = date(locate);
end;

for i = 1:numStock
    stock(i+1).date = char(stock(i+1).date);
    D = textscan(stock(i+1).date, '%s %s %s', 'delimiter','/');
    stock(i+1).month = D{1}(1:end);
    stock(i+1).day = D{2}(1:end);
    stock(i+1).year = D{3}(1:end);
end

我最初想将它们保存为整数(并使用 %u 代替),但我遇到了一个奇怪的情况,我的大多数条目都只是 0 而非零条目非常大(显然不是我所期望的)。但是,上面的表单返回以下错误:

Error using textscan
Buffer overflow (bufsize = 4095) while reading string from
file (row 1 u, field 1 u).  Use 'bufsize' option. See HELP TEXTSCAN.
44444444444444444444455555555555555555555566666666666666666666677777777777777777777778888888888888888888889999999999999999999990000000000000000000000011111111111111111112222222222222222222222111111111

Error in makeData_CRSP (line 87)
D = textscan(stock(i+1).date, '%s %s %s', 'delimiter','/');

所以老实说,我不知道如何处理这个问题。我究竟做错了什么?查看我如何为数据结构保存日期向量,这是解决此问题的最佳方法吗?

4

1 回答 1

1

您可以使用该datenum函数将日期转换为数字。语法是datenum(dateString, format). 例如,如果您的日期格式YYYY MM DD

datenum('2012 12 04', 'yyyy mm dd')

一旦你像这样转换了所有日期,你可以简单地使用>和比较结果数字<

>> datenum('2012 12 04', 'yyyy mm dd') > datenum('2012 12 03', 'yyyy mm dd')

ans =

     1

>> datenum('2012 12 04', 'yyyy mm dd') > datenum('2012 12 05', 'yyyy mm dd')

ans =

     0
于 2012-12-04T06:43:57.680 回答