2

さまざまなソースからさまざまな長さの複数のデータ セットがあります。1 つの txt ファイルには秒単位の時間があり、別のファイルには 10hz 単位 (時間によって異なる) があるため、データが乱雑です。これらの種類のデータセットを比較しようとしていますが、最初に時系列を隣接するデータ列と同期するスマートな方法が必要です。どんな助けでも大歓迎です。

次に、2 つのデータ セットの例を示します。

データセット 1

Time              data 1         data 2      data 3
12:19:00 PM       0.06875        0.1625      0
12:19:01 PM       0.06875        0.1625      0
12:19:02 PM       0.06875        0.1625      0
12:19:05 PM       0.06875        0.1625      0
12:20:06 PM       0.06875        0.15625     0
12:20:00 PM       0.06875        0.1625      0.02300251

データのサイズ 1 は 600、10

データセット 2

データセット 2 は、より多くの列と、異なる頻度で異なる開始時間と終了時間で似ているため、データ 2 のサイズは次のとおりです。[1000, 40]

Time            data 4    data 5    data 6      data 7     ...
12:00:00 PM     0.45875   0.1625    0
12:19:01 PM     0.06875   0.1625    0
12:19:01 PM     0.06875   0.1625    0
12:19:01 PM     0.06875   0.1625    0
12:20:00 PM     0.06875   0.15625   0
12:20:00 PM     0.06875   0.1625    0.02300251
...
1.00.20 PM      ...       ...       ...

私の質問が明確でない場合は申し訳ありません。

短い時間軸に基づいて 3 番目の時間軸を生成しようとしています。したがって、この場合、2 番目のファイルを 2 秒間隔で平均化する必要があります (欠損データを考慮して) 目的は、データセット 1 とデータセット 2 のデータ 1 とデータ 2 を同じタイムスタンプで比較することです

ファイル 1 のサイズがファイル 2 のサイズと等しくありません

4

2 に答える 2

1

2 つのデータ セットを比較する最良の方法は、時刻を同期することです。

x1=dlmread('C:\folder\yourfile1.txt'); 
x2=dlmread('C:\folder\yourfile2.txt');

t1 = x1(:,1);
tsr1=timeseries(x1,t1);
t2 = x2(:,1);
tsr2=timeseries(x2,t2);

% Sync 1 and 2
[new_ts12_1 new_ts12_2] = synchronize(tsr1,tsr2,'Uniform','Interval',1)

データを補間する方法を決定できます。デフォルトは線形です

于 2013-06-21T16:36:52.267 に答える
0

You'll need to interpolate; you can use interp1 for your case. Use like so:

new_data = interp1(times, [data1 data2 data3 ...], new_times)

your times need not be sorted. new_times is then the (equally-spaced) times you want values on.

This results in linear interpolation. You could do

new_data = interp1(times, [data1 data2 data3 ...], new_times, 'cubic')

to use a cubic interpolant. See help interp1 for more information.

Note that new_data will be size(new_times) x size([data1 data2 data3 ...]).

EDIT:

So, for your case, this is how you'd use it:

% Your data sets
dataset_1 = {...
    '12:19:00 PM       0.06875        0.1625      0'
    '12:19:01 PM       0.06875        0.1625      0'
    '12:19:02 PM       0.06875        0.1625      0'
    '12:19:05 PM       0.06875        0.1625      0'
    '12:20:06 PM       0.06875        0.15625     0'
    '12:20:00 PM       0.06875        0.1625      0.02300251'
    };

dataset_2 = {...
    '12:00:00 PM     0.45875   0.1625    0'
    '12:19:01 PM     0.06875   0.1625    0'
    '12:19:01 PM     0.06875   0.1625    0'
    '12:19:01 PM     0.06875   0.1625    0'
    '12:20:00 PM     0.06875   0.15625   0'
    '12:20:00 PM     0.06875   0.1625    0.02300251'
    };

% (This step is probably not needed (or should be changed) if you're
% reading from file)
dataset_1 = cellfun(@(x) textscan(x, '%s%s%f%f%f'), dataset_1, 'UniformOutput', false);
dataset_2 = cellfun(@(x) textscan(x, '%s%s%f%f%f'), dataset_2, 'UniformOutput', false);

% Extract & convert times
times_1 = cellfun(@(x) datenum( [x{1}{1} x{2}{1}] ), dataset_1);
times_2 = cellfun(@(x) datenum( [x{1}{1} x{2}{1}] ), dataset_2);

% Prepare the data for interpolation 
dataset_1 = cellfun(@(x) [x{3:end}], dataset_1, 'UniformOutput', false);
dataset_1 = cell2mat(dataset_1);

dataset_2 = cellfun(@(x) [x{3:end}], dataset_2, 'UniformOutput', false);
dataset_2 = cell2mat(dataset_2);

[times_12, inds] = unique([times_1; times_2]); % (must use distrinct times)
dataset_12 = [dataset_1; dataset_2];
dataset_12 = dataset_12(inds,:);               % (and corresponding data) 

% Create a new times vector, that increases in regular steps
% (100 for this example)
times_3 = linspace(min(times_12), max(times_12), 100); 

% Now interpolate
dataset_3 = interp1(times_12, dataset_12, times_3)
于 2013-06-17T21:08:31.677 に答える