我每隔10分钟采集数据,但是有很多数据缺口,我想把它平均在一个统一的每小时的时间网格上。我正在寻找一种有效的方法,把每小时的任何一边的三个潜在点,并将他们平均到一个小时。
示例:
t_old = 1:35 1:45 1:55 - 2:15 2:25 %-缺少数据
t_new = 2:00
data_old =1 2 3-5 6
data_new = 3.4
问题是,有足够的数据缺口,我不能只是直接的垃圾箱平均。我知道,我可以通过每一个新的时间步骤,并使用find()的半小时偏移,但我觉得这将是可怕的低效和缓慢。有什么更快的方法吗?也许有什么方法可以把垃圾桶装到最近的一个小时,然后是普通的垃圾箱?
为MWE编辑:
t=1:10;
tnew=2:2:8;
data=1:10;
t(3)=[];
data(3)=[];
dt=2;
for i=1:length(tnew)
datanew(i)=mean(data(find(t>(tnew(i)-dt) & t<(tnew(i)+dt))));
end
datanew发布于 2014-09-11 18:39:07
方法#1
tnew_lb = tnew-dt; %// lower bound
tnew_ub = tnew+dt; %// upper bound
[r,c] = find(bsxfun(@gt,t',tnew_lb) & bsxfun(@lt,t',tnew_ub));
datanew = accumarray(c,data(r),[], @mean)方法#2
timestep = min(diff(t)); %// Minimum time-stepsize for t
t_all = min(t):timestep:max(t); %// create all the timesteps
[b1,b2] = ismember(t,t_all);
ind = bsxfun(@plus,[tnew(1)-dt+1:tnew(1)+dt-1]',[0:numel(tnew)-1]*dt);
[v1,v2] = ismember(ind,t_all(b2));
vind = v2~=0;
v2(v2==0) = NaN;
v2(vind) = data(v2(vind));
out = nanmean(v2);发布于 2014-09-12 10:29:39
在您询问了有关histc方法的评论之后,我在这里发布它。虽然这是而不是最快的方法--如果这是您希望对数据所做的全部工作--但是在以后需要重用bin信息(数据分类)时,它可能很有用。
以下代码:
%% // prepare
clear all
t=1:10;
tnew=2:2:8;
data=1:10;
t(3)=[];
data(3)=[];
nLoop = 50000 ;
%% // initial method
tic ;
for iLoop = 1:nLoop
clear datanew
dt=1;
for i=1:length(tnew)
datanew(i)=mean( data( find(t>=(tnew(i)-dt) & t<(tnew(i)+dt)) ));
end
end
toc
%% // initial method optimized
tic ;
for iLoop = 1:nLoop
clear datanew
dt=1;
datanew = zeros( size(tnew) ) ;
for i=1:length(tnew)
datanew(i)=mean( data( t>=(tnew(i)-dt) & t<(tnew(i)+dt) ));
end
end
toc
%% // histc method
xedges = [tnew(1)-dt tnew+dt] ; %// => xedges = [1:2:9] ;
tic
for iLoop = 1:nLoop
clear newdata
newdata = zeros( size(tnew)) ;
[n,bins] = histc( data , xedges ) ;
for iBin=1:length(n)-1
newdata(iBin) = mean( data(bins==iBin) );
end
end
toc产生以下输出:
Elapsed time is 3.177801 seconds.
Elapsed time is 2.910844 seconds.
Elapsed time is 2.948526 seconds.我用不同的循环迭代次数多次运行它,结果总是一致的。优化的初始方法总是比组蛋白法快。我并不是组方法的忠实拥趸,因为在我们已经绑定了所有数据之后,它仍然涉及一个循环和比较(data(bins==iBin)),而不是直接索引。
不过,两者的比较略有不同。一种是>类型的,操作在浮点数上,另一种是=和比较索引(理论上是整数,但我不确定Matlab如何在内部表示它们,所以可能没有好处)。
无论如何,这可能会导致与我获得的更大更复杂的数据集不同的执行时间,因此欢迎您在实际数据上尝试这些方法,并让我们知道它是如何为您工作的。
ps:我稍微修改了初始示例,这样平均时间窗口就不再重叠了(将dt=1和一个>更改为>=)。这样,所有方法都返回相同的结果。
https://stackoverflow.com/questions/25793556
复制相似问题