0

私の質問をする前に、私が何をしているのか理解できるように、ここで少し背景を説明します。非常に大きなデータ セット (2,000,000 行弱) を分析しようとしています。私はデータセットをMatlabに解析し、このデータから構造配列を構築し、各アセットの名前、日付、返品などを与えました。ここで、データ セットを 2 日間に制限したいと思いますが、Matlab はそのようなアプローチには特に適していないようです。私に与えられた 1 つの提案は、MM/DD/YYYY 形式の日付を取得し、区切り文字「/」を使用して、データ構造の 3 つの整数配列を何らかの方法で構築することでした (これを 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 に答える