我有来自不同长度的不同来源的多个数据集。一个txt文件有几秒钟的时间,另一个有10hz的时间(有时变化)所以我的数据很乱。 我试图比较这些类型的数据集,但我需要一种智能的方法来首先同步时间序列以及相邻的数据列。 任何帮助将不胜感激。
以下是两个示例数据集:
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
数据大小为600,10
数据集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
file1的大小不等于文件2的大小
答案 0 :(得分:1)
比较两组数据的最佳方法是对其进行时间同步。
X1 = dlmread( 'C:\文件夹\ yourfile1.txt');
X2 = dlmread( 'C:\文件夹\ yourfile2.txt');
t1 = x1(:,1);
TSR1 =时间序列(X1,T1);
t2 = x2(:,1);
TSR2 =时间序列(X2,T2);
%同步1和2
[new_ts12_1 new_ts12_2] =同步(tsr1,tsr2,'统一','间隔',1)
您可以决定如何插入数据,默认为线性
答案 1 :(得分: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_data
为size(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)