在MATLAB中从时间序列中删除重复值

时间:2019-06-03 21:13:24

标签: matlab duplicates time-series unique interpolation

我有一个类似这样的时间序列:

Time    Data
-------------
802     1
803     2
803     3
804     7

我想使用interp(x,v,xq),其中x为时间,v为数据,但是该函数要求我具有不同的x值。如何在MATLAB时间序列中删除/平均重复行?

我尝试了interp(unique(timeseriesname.time), timeseriesname.data, timeseriesref.time)

但这与我的数据不匹配。有没有简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

如果仅希望插值按原样处理数据,则可以尝试使用resample对象的timeseries方法。当然,对于您的给定示例,它将在时间点803周围显示不连续,但仍然可以正常工作,没有错误:

>> ts = timeseries([1 2 3 7].', [802 803 803 804]);
>> rs = resample(ts, 802:0.25:804);
>> [rs.time rs.data]

ans =

  802.0000    1.0000
  802.2500    1.2500
  802.5000    1.5000
  802.7500    1.7500
  803.0000    3.0000
  803.2500    4.0000
  803.5000    5.0000
  803.7500    6.0000
  804.0000    7.0000

请注意时间点803的值为3,但是插值从下面接近值2

如果您只想通过对重复项进行平均来删除它们,则可以使用函数uniqueaccumarray来创建新的timeseries对象,如下所示:

>> [newTime, ~, index] = unique(ts.time);
>> newTS = timeseries(accumarray(index, ts.data, [], @mean), newTime);
>> [newTS.time newTS.data]

ans =

  802.0000    1.0000
  803.0000    2.5000
  804.0000    7.0000

或者,如果您想修改原始 timeseries对象的时间和数据,则可以使用set方法同时设置它们:

[newTime, ~, index] = unique(ts.time);
newData = accumarray(index, ts.data, [], @mean);
set(ts, 'Time', newTime, 'Data', newData);