【问题标题】:Removing duplicate values from a timeseries in MATLAB从 MATLAB 中的时间序列中删除重复值
【发布时间】:2019-10-19 10:28:13
【问题描述】:

我有一个看起来像这样的时间序列:

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)

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

【问题讨论】:

  • resample 方法对您有用吗? newSeries = resample(timeseriesname, timeseriesref.time); 当然,对于给定的示例,它在时间点 803 附近会有不连续性,所以它可能不是您需要的。
  • 也许吧。我有很多数据,只有少数重复,所以这可能有效。我试试看。

标签: matlab duplicates time-series unique interpolation


【解决方案1】:

如果您只想按原样对数据进行插值,您可以尝试对 timeseries 对象使用 resample 方法。当然,对于您给定的示例,它将在时间点 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);

【讨论】:

  • 第二种解决方案非常接近我想要的。有没有办法附加/修改以前的 Ts,以便 newTS 和 oldTS 的属性相同,而无需遍历每个属性?
  • @Sunden:我添加了修改原始timeseries 对象的选项。
  • 太棒了!正是我想要的,谢谢。你为我节省了很多时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2012-05-19
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多