2

我每隔 10 分钟采集一次数据,但有很多数据空白,我想将其平均到一个统一的每小时时间网格上。我正在寻找一种有效的方法来获取每小时两侧的 3 个潜在点并将它们平均到每小时。

例子:

t_old = [1:35 1:45 1:55 -- 2:15 2:25] %here -- 缺少数据

t_new = 2:00

数据旧 = [1 2 3 -- 5 6]

数据新 = 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
4

2 回答 2

1

方法#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-11T18:39:07.907 回答
1

在您询问有关该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.

我用不同的循环迭代次数多次运行它,结果总是一致的。优化的初始方法总是比histc方法快。我不是 histc 方法的忠实拥护者,因为在我们已经对所有数据进行分箱后,它仍然涉及循环和比较 ( data(bins==iBin)),而不是直接索引。

虽然比较略有不同。一个是类型>并且对浮点数进行操作,而另一个是=比较索引(理论上是整数,但我不确定Matlab如何在内部表示它们,所以它可能没有好处)。

无论如何,这可能会导致与我使用更大和更复杂的数据集获得的执行时间不同,因此欢迎您在真实数据上尝试这些方法,并随时让我们知道它是如何为您工作的。


ps:我稍微修改了您的初始示例,因此平均时间窗口中不再有重叠(更改为dt=11 )。这样,所有方法都返回相同的结果。>>=

于 2014-09-12T10:29:39.293 回答