1

次の形式で記述されたレコードを含む .csv ファイルがあります。

2010-04-20 15:15:00,"8.9915176259e+00","8.8562623697e+00"
2010-04-20 15:30:00,"8.5718021723e+00","8.6633827160e+00"
2010-04-20 15:45:00,"8.4484844117e+00","8.4336586330e+00"
2010-04-20 16:00:00,"1.1106980342e+01","8.4333062208e+00"
2010-04-20 16:15:00,"9.0643470589e+00","8.6885660103e+00"
2010-04-20 16:30:00,"8.2133517943e+00","8.2677822671e+00"
2010-04-20 16:45:00,"8.2499419380e+00","8.1523501983e+00"
2010-04-20 17:00:00,"8.2948492278e+00","8.2884797924e+00"

これらのデータからクラスターを作成したいと思います-時間を示す数字の列を追加したいので、最初の行の場合、値15を新しい行に追加する必要があります.

最初の問題は、関数を呼び出すことです

[numData, textData, rawData] = xlsread('testData.csv')

空の行列 numData と 1 列の textData および rawData 構造を作成します。

上記のデータから yyyy、MM、dd、hh、mm、ss の値を認識するテンプレートを作成することは可能ですか?

これらのデータで基本的にやりたいことは、値を時間ごとに分類することです。入力の例の行から:

2010-04-20 15:15:00,"8.9915176259e+00","8.8562623697e+00"

更新 1: Matlab では、上記の行は文字列として認識されます。

'2010-04-26 13:00:00,"1.0428104753e+00","2.3456394130e+00"'

これを出力にしたい:

15, 8.9915176259e+00, 8.8562623697e+00

更新 1: 文字列を解析する必要があります

文字列を解析してタイムスタンプ ('2010-04-20 15:15:00')、value1 (1.0428104753e+00)、および value2 (2.3456394130e+00) を個別の値として取得する方法を知っている人はいますか?

4

4 に答える 4

2

サンプル ファイル データでXLSREADを使用すると、 yukと同じように正しい出力が得られます。XLSREADのドキュメントの次のステートメントは、発生している問題を説明している可能性があります。

システムに Excel for Windows がインストールされていない場合、または MATLAB が COM サーバーにアクセスできない場合、xlsread は基本モードで動作します。このモードでは、 xlsreadXLS ファイルのみを読み取ります。

別の方法として、 TEXTSCANを使用してサンプル データ ファイルを読み取ることもできました。

>> fid = fopen('testData.csv','r');                    %# Open the file
>> data = textscan(fid,'%s %s %s','Delimiter',',',...  %# Read the data
                   'CollectOutput',true);
>> fclose(fid);                                        %# Close the file
>> data = strrep(data{1},'"','')  %# Format the data and remove '"'

data = 

    '2010-04-20 15:15:00'    '8.9915176259e+00'    '8.8562623697e+00'
    '2010-04-20 15:30:00'    '8.5718021723e+00'    '8.6633827160e+00'
    '2010-04-20 15:45:00'    '8.4484844117e+00'    '8.4336586330e+00'
    '2010-04-20 16:00:00'    '1.1106980342e+01'    '8.4333062208e+00'
    '2010-04-20 16:15:00'    '9.0643470589e+00'    '8.6885660103e+00'
    '2010-04-20 16:30:00'    '8.2133517943e+00'    '8.2677822671e+00'
    '2010-04-20 16:45:00'    '8.2499419380e+00'    '8.1523501983e+00'
    '2010-04-20 17:00:00'    '8.2948492278e+00'    '8.2884797924e+00'

DATEVECCELLFUN、およびSTR2NUMを使用して、セル配列内の文字列dataを数値の行列にフォーマットできるようになりました。

>> dateVectors = datevec(data(:,1));  %# Format the date string
>> newData = [dateVectors(:,4) cellfun(@str2num,(data(:,2:3)))]

newData =                        %# A numeric matrix

   15.0000    8.9915    8.8563
   15.0000    8.5718    8.6634
   15.0000    8.4485    8.4337
   16.0000   11.1070    8.4333
   16.0000    9.0643    8.6886
   16.0000    8.2134    8.2678
   16.0000    8.2499    8.1524
   17.0000    8.2948    8.2885
于 2010-05-20T15:26:16.180 に答える
1
datevec('2010-04-20 15:15:00')
ans =

        2010           4          20          15          15           0

他の2つの列のstr2numとcsvwriteも友達になります。

あなたの質問をすべて理解できるかどうかはわかりませんが、これで解決に向けてうまくいくと思います。

于 2010-05-20T14:19:09.247 に答える
0

http://www.mathworks.com/matlabcentral/fileexchange/19707-xls2structを使用

.csv ファイルに「ヘッダー」行があると仮定します。この例では (time, v1, v2) を使用しました。

 data=xls2struct('t.csv');
 timeVec = datevec(data.time);
 data.time = timeVec(:,4); %replace time with hours
 matData=[data.time, data.v1,data.v2] %concat data from the struct

matData =

   15.0000    8.9915    8.8563
   15.0000    8.5718    8.6634
   15.0000    8.4485    8.4337
   16.0000   11.1070    8.4333
   16.0000    9.0643    8.6886
   16.0000    8.2134    8.2678
   16.0000    8.2499    8.1524
   17.0000    8.2948    8.2885
于 2010-05-20T15:00:18.447 に答える
0

DATEVECを使用して、日付文字列を年、月、日、時、分、および秒に変換できます。

DV = datevec(textData)

DV =

        2010           4          20          15          15           0
        2010           4          20          15          30           0
        2010           4          20          15          45           0
        2010           4          20          16           0           0
        2010           4          20          16          15           0
        2010           4          20          16          30           0
        2010           4          20          16          45           0
        2010           4          20          17           0           0

Hours = DV(:,4);

編集

(R2010a)サンプルデータとコードを使用する場合

[numData, textData, rawData] = xlsread('testData.csv')

numData の最後の 2 つの列と textData の最初の列を取得します。DATEVEC を textData に適用すると、日付文字列が数値に変換されます。

EDIT2

文字列を解析するには、次のようにします。

s = '2010-04-20 15:15:00,"8.9915176259","8.8562623697"';
s2 = regexprep(s,'"','');
A = textscan(s2,'%s %f %f','Delimiter',',');
DV = datevec(A{1});
result = [DV(4) A{2:3}];
于 2010-05-20T14:21:55.367 に答える