2

我有来自不同长度的不同来源的多个数据集。一个 txt 文件的时间以秒为单位,另一个以 10hz 为单位(有时会有所不同),所以我的数据很乱。我正在尝试比较这些类型的数据集,但我需要一种聪明的方法来首先同步时间序列以及相邻的数据列。任何帮助,将不胜感激。

以下是两个示例数据集:

数据集 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      ...       ...       ...

抱歉,如果我的问题不清楚。

我希望根据较短的时间轴生成第三个时间轴。所以对于这种情况,我必须将第二个文件平均为 2 秒间隔(考虑到丢失的数据) 目标是在同一时间戳比较数据集 1 和数据集 2 中的数据 1 和数据 2

文件 1 的大小不等于文件 2 的大小

4

2 回答 2

1

比较两组数据的最佳方法是时间同步。

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

你需要插值;你可以使用interp1你的情况。像这样使用:

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

times不需要排序。new_times然后是您想要值的(等距)时间。

这导致线性插值。你可以做

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

使用三次插值。有关help interp1更多信息,请参阅。

请注意,new_datasize(new_times) x size([data1 data2 data3 ...]).

编辑

因此,对于您的情况,这就是您使用它的方式:

% 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 回答