【问题标题】:Select portion of timeseries选择时间序列的一部分
【发布时间】:2015-02-03 19:39:49
【问题描述】:

在下面的代码中,我创建了一个简单的数据序列、一个时间向量和一个时间序列。绘制它们两个我都没有问题。 (它们在同一个图上并不重要。)我无法弄清楚的是如何对时间序列的一部分进行子集化,如最后一个因错误而失败的命令所示:

>> timeseriesTest
Error using timeseries/plot (line 27)
The plot method can only be used for a single timeseries object

Error in timeseriesTest (line 14)
plot(ts(25:end));

>> 

如何提取时间序列中的最后 25 个(在本例中)值?重要提示:虽然在下面的代码中不是这样,但我的时间序列有每天或每周的时间戳,我确实需要保留它。即:

NewData = ts.data 

...不是一个好的答案,除非它是获取新提取时间序列的唯一方法。

t=[1:50];
d=sin(2*pi*t/20);

ts = timeseries(2*d, t);

%plot data and timeseries
plot(d);
hold on;
plot(ts);

figure();
plot(d(25:end));
hold on;
plot(ts(25:end));

【问题讨论】:

    标签: matlab time-series


    【解决方案1】:

    如果您查看TimeSeries 对象的属性,当您在尝试绘制之前运行代码时,我们会看到以下内容:

    >> ts
    
      timeseries
    
      Common Properties:
                Name: 'unnamed'
                Time: [50x1 double]
            TimeInfo: [1x1 tsdata.timemetadata]
                Data: [1x1x50 double]
            DataInfo: [1x1 tsdata.datametadata]
    

    您会看到您的时间序列对象中有一个Data 字段,以及一个表示每个点实例的时间值的Time 字段。如果您想单独访问这些字段并绘制最后 25 个元素,请执行以下操作:

    plot(ts.Time(end-24:end), squeeze(ts.Data(end-24:end)));
    

    ts 是您的 TimeSeries 对象,如果您想访问该对象中的字段,请使用点运算符(.... 您已经知道了)。使用点运算符后,您只需使用适当的名称访问所需的字段。因此,如果您需要时间值,请使用Time,如果您需要数据,请使用Data。现在,看起来很奇怪的是我使用了squeezesqueeze 删除单件维度。如果你能看到,Data 是一个 1 x 1 x 50 数组,而实际上它应该只是一个 50 x 1 数组。 squeeze的目的是去除多余的维度来获取我们的实际数据。

    请注意,这似乎只有在您的时间序列中只有一个信号时才会发生。如果我们有多个信号...例如,如果我们想要三个长度为 50 的信号,我们将创建一个 50 x 3 矩阵,其中每个 column 表示一个信号。它看起来像这样:

    >> t = 1:50;
    >> A = rand(50,3);
    >> ts = timeseries(A,t)
    
      timeseries
    
      Common Properties:
                Name: 'unnamed'
                Time: [50x1 double]
            TimeInfo: [1x1 tsdata.timemetadata]
                Data: [50x3 double]
            DataInfo: [1x1 tsdata.datametadata]
    

    rand[0-1] 的范围内生成任意大小的随机矩阵或向量。你会看到我们的信号现在是50 x 3。如果您想绘制此图,plot 在每个时间范围内识别多个信号......所以您可以这样做:

    plot(ts.Time, ts.Data);
    

    这应该会生成一个由三个轨迹组成的图,每个轨迹由不同的颜色描绘,并且在 ts.Time 指定的同一时间范围内。

    同样,如果您想绘制每个信号的最后 25 个点,只需执行以下操作:

    plot(ts.Time(end-24:end), ts.Data(end-24:end,:));
    

    此代码将访问您的 Data 中每一列(即每个信号)的最后 25 行,并将它们全部绘制出来。

    【讨论】:

    • 谢谢 rayryeng。如果我能给你100分,我会的。很好的答案,坦率地说,我很惊讶没有在 StackOverflow 上找到某个地方,所以我希望它在未来能给你带来很多积分。
    • @LGTrader - 感谢您的意见!坦率地说,我很惊讶这个问题也没有得到解决,我不得不为此写一个答案......很奇怪!......但还是谢谢你:)
    猜你喜欢
    • 2012-10-26
    • 2023-03-19
    • 2015-03-17
    • 2016-09-12
    • 2018-05-08
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多