Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

时序对象和集合

时序的类型及其用途

MATLAB® 时序对象有两种类型:

  • timeseries - 存储数据和时间值,以及包含单位、事件、数据质量和插值方法的元数据信息

  • tscollection - 存储共享公共时间向量的 timeseries 对象的集合,便于对具有不同单位的同步时序执行操作

本节讨论以下主题:

  • 使用时序构造函数来实例化时序类

  • 使用 set 方法或圆点表示法修改对象属性

  • 调用时序函数和方法

要快速了解有关使用 timeseriestscollection 对象进行编程的信息,请按照示例:时序对象和方法中的步骤进行操作。

时序数据样本

要正确理解本文档中有关 timeseries 对象属性和方法的说明,必须了解与在 timeseries 对象中存储数据相关的一些术语 - 尤其是数据值数据样本的区别。

数据值是在特定时间记录的单个标量值。数据样本timeseries 对象中与特定时间关联的一个或多个值组成。一个时序中的数据样本数量与时间向量的长度相同。

以由三个传感器信号组成的数据为例:其中两个信号表示对象的位置,以米为单位;第三个信号表示其速度,以米/秒为单位。

要输入数据矩阵,请在 MATLAB 提示符下键入以下内容:

x = [-0.2 -0.3 13;
     -0.1 -0.4 15;
      NaN  2.8 17;
      0.5 0.3 NaN;
     -0.3 -0.1 15]

NaN 值代表缺失的数据值。MATLAB 将显示以下 5×3 矩阵:

 x=
   -0.2000   -0.3000   13.0000
   -0.1000   -0.4000   15.0000
    NaN       2.8000   17.0000
    0.5000    0.3000       NaN
   -0.3000   -0.1000   15.0000

x 的前两列包含具有相同单位的数量,您可以创建多变量 timeseries 对象来存储这两个时序。有关创建 timeseries 对象的详细信息,请参阅时序构造函数。以下命令创建 timeseries 对象 ts_pos 来存储位置值:

ts_pos = timeseries(x(:,1:2), 1:5, 'name', 'Position')

MATLAB 通过显示 ts_pos 的以下属性作出响应:

timeseries

  Common Properties:
            Name: 'Position'
            Time: [5x1 double]
        TimeInfo: [1x1 tsdata.timemetadata]
            Data: [5x2 double]
        DataInfo: [1x1 tsdata.datametadata]

  More properties, Methods

时间向量的 Length(在本示例中为 5)等于 timeseries 对象中的数据样本数。通过在 MATLAB 提示符下键入以下内容,在 ts_pos 中找到数据样本的大小:

getdatasamplesize(ts_pos)

ans =

     1     2

同样,您可以创建另一个 timeseries 对象来存储速度数据:

ts_vel = timeseries(x(:,3), 1:5, 'name', 'Velocity');

通过键入以下内容在 ts_vel 中找到每个数据样本的大小:

getdatasamplesize(ts_vel)

ans =

     1     1

请注意,ts_vel 在每个数据样本中有一个数据值,而 ts_pos 在每个数据样本中有两个数据值。

注意

通常,当时序数据是具有 M 个样本的 M×N×P×... 多维数组时,每个数据样本的大小为 N×P×...。

如果您要对 ts_posts_vel timeseries 对象执行操作且同时使它们保持同步,请将它们组合到一个时序集合中。有关详细信息,请参阅时序集合构造函数语法

示例:时序对象和方法

创建时序对象

这一部分示例说明如何从数组中创建若干个 timeseries 对象。有关 timeseries 对象的详细信息,请参阅时序构造函数

将样本数据从 count.dat 导入 MATLAB 工作区。

load count.dat

这会将 24×3 矩阵 count 添加到工作区中。count 中的每一列分别代表三个城镇十字路口中每个十字路口每小时经过的车辆计数。

查看 count 矩阵。

count

创建三个 timeseries 对象来存储在每个十字路口收集的数据。

count1 = timeseries(count(:,1), 1:24,'name', 'intersection1');
count2 = timeseries(count(:,2), 1:24,'name', 'intersection2');
count3 = timeseries(count(:,3), 1:24,'name', 'intersection3');

注意

在上述构造中,timeseries 对象同时具有变量名称(例如 count1)和内部对象名称(例如 intersection1)。变量名称与 MATLAB 函数结合使用。对象名称是对象的属性,可以使用对象方法进行访问。有关 timeseries 对象属性和方法的详细信息,请参阅时序属性时序方法

默认情况下,一个时序具有一个时间向量,该时间向量的单位为秒,开始时间为 0 秒。此示例构造开始时间为 1 秒、结束时间为 24 秒、增量为 1 秒的 count1count2count3 时序对象。您将在修改时序单位和插值方法中将时间单位更改为小时。

注意

如果要创建一个用于组合 count 中的三个数据列的 timeseries 对象,请使用以下语法:

count_ts = timeseries(count, 1:24,'name','traffic_counts')

当所有时序具有相同的单位并且您要在计算过程中使它们保持同步时,这很有用。

查看时序对象

按照创建时序对象中的描述创建 timeseries 对象后,您可以在变量编辑器中查看它。

要在变量编辑器中查看 timeseries 对象,如 count1,请使用以下任一方法:

  • 在命令提示符下键入 open('count1')

  • 主页选项卡上的变量部分中,点击打开变量并选择 count1。此方法在 MATLAB Online™ 中不可用。

修改时序单位和插值方法

创建时序对象中所述创建 timeseries 对象后,可以使用圆点表示法修改其单位和插值方法。

查看 count1 的当前属性。

get(count1)

MATLAB 显示 count1 timeseries 对象的当前属性值。

使用圆点表示法查看当前 DataInfo 属性。

count1.DataInfo

count1 的数据单位更改为 'cars'

count1.DataInfo.Units = 'cars';

count1 的插值方法设置为零阶保持。

count1.DataInfo.Interpolation = tsdata.interpolation('zoh');

确认 DataInfo 属性已修改。

count1.DataInfo

将三个时序的时间单位修改为 'hours'

count1.TimeInfo.Units = 'hours';
count2.TimeInfo.Units = 'hours';
count3.TimeInfo.Units = 'hours';

定义事件

示例的此部分说明如何使用 tsdata.event 辅助对象为 timeseries 对象定义事件。事件在特定时间标记数据。绘制数据时,事件标记会显示在绘图上。事件还是同步多个时序的一种便捷方式。

在数据中添加两个事件,分别标记早上和下午的通勤时间。

构造第一个事件并将其添加到所有时序。第一个事件发生在早上 8 点。

e1 = tsdata.event('AMCommute',8);
e1.Units = 'hours';            % Specify the units for time
count1 = addevent(count1,e1);  % Add the event to count1
count2 = addevent(count2,e1);  % Add the event to count2
count3 = addevent(count3,e1);  % Add the event to count3

构造第二个事件并将其添加到所有时序。第二个事件发生在下午 6 点。

e2 = tsdata.event('PMCommute',18);
e2.Units = 'hours';            % Specify the  units for time
count1 = addevent(count1,e2);  % Add the event to count1
count2 = addevent(count2,e2);  % Add the event to count2
count3 = addevent(count3,e2);  % Add the event to count3

对时序 count1 绘图。

figure
plot(count1)

对任何时序绘图时,为时序对象定义的绘图方法都会将事件显示为标记。默认标记是红色实心圆。

绘图反映 count1 使用零阶保持插值。

绘制 count2

plot(count2)

如果绘制时序 count2,它会替换 count1 显示。您会看到它的事件,并且它使用线性插值。

通过设置 hold on 覆盖时序绘图。

hold on
plot(count3)

创建时序集合对象

示例的此部分说明如何创建 tscollection 对象。集合中的每个时序称为一个成员。有关 tscollection 对象的详细信息,请参阅时序集合构造函数

注意

通常,您可以使用 tscollection 对象对具有不同单位的同步时序进行组合。在此简单示例中,所有时序具有相同的单位,因此相对于将三个时序组合到单一 timeseries 对象而言,tscollection 对象没有优势。有关如何在一个 timeseries 对象中组合多个时序的示例,请参阅创建时序对象

创建一个名为 count_colltscollection 对象,并使用构造函数语法立即添加当前在 MATLAB 工作区中的三个时序中的两个(稍后将添加第三个时序)。

tsc = tscollection({count1 count2},'name', 'count_coll')

注意

添加到 tscollectiontimeseries 对象的时间向量必须匹配。

请注意,timeseries 对象的 Name 属性用于将集合成员命名为 intersection1intersection2

将工作区中的第三个 timeseries 对象添加到 tscollection

tsc = addts(tsc, count3)

集合中的所有三个成员都已列出。

对时序集合对象重采样

示例的此部分说明如何使用新时间向量对 tscollection 中的每个成员进行重采样。重采样操作用于选择在特定时间值的现有数据,或以更精细的时间间隔进行数据插值。如果新时间向量包含在前一时间向量中不存在的时间值,则使用与时序关联的默认插值方法计算新数据值。

对时序进行重采样以包含每 2 小时(而不是每小时)的数据值,并将其保存为新 tscollection 对象。

tsc1 = resample(tsc,1:2:24)

在某些情况下,您可能需要比当前更精细的信息采样,通过对数据值进行插值可实现此目的。

在每个半小时标记处进行插值。

tsc1 = resample(tsc,1:0.5:24)

在每个半小时标记处添加值时,将使用时序的默认插值方法。例如,intersection1 中的新数据点是使用零阶保持插值方法计算的,该方法会保存上一个样本常量的值。按照修改时序单位和插值方法中所述设置 intersection1 的插值方法。

使用线性插值(这是默认方法)计算 intersection2intersection3 中的新数据点。

对具有标记的 tsc1 成员进行绘图以查看插值结果。

hold off                % Allow axes to clear before plotting
plot(tsc1.intersection1,'-xb','Displayname','Intersection 1')

您可以看到以半小时为间隔对数据点进行了插值,并且 Intersection 1 使用零阶保持插值,而其他两个成员使用线性插值。

在您将其他两个成员添加到绘图时,请保持图形位于图窗中。由于 plot 方法不显示轴标签,而 holdon,因此还要添加一个图例来描述这三个序列。

hold on
plot(tsc1.intersection2,'-.xm','Displayname','Intersection 2')
plot(tsc1.intersection3,':xr','Displayname','Intersection 3')
legend('show','Location','NorthWest')

将数据样本添加到时序集合对象

示例的此部分说明如何将数据样本添加到 tscollection

在 3.25 小时(即该整点时间后 15 分钟)处向 intersection1 集合成员添加一个数据样本。

tsc1 = addsampletocollection(tsc1,'time',3.25,...
       'intersection1',5);

tsc1 集合中有三个成员,在 3.25 小时处向一个成员添加数据样本时,也会向其他两个成员添加数据样本。但是,由于您未在新样本中指定 intersection2intersection3 的数据值,因此对于这些成员,缺失值由 NaN 表示。要了解如何删除缺失数据值或对其进行插值,请参阅删除缺失数据对缺失数据进行插值

从 2.0 到 3.5 小时的 tsc1 数据

小时

Intersection 1

Intersection 2

Intersection 3

2.0

7

13

11

2.5

7

15

15.5

3.0

14

17

20

3.25

5

NaN

NaN

3.5

14

15

14.5

要查看所有 intersection1 数据(包括 3.25 小时处的新样本),请键入

tsc1.intersection1

同样,要查看所有 intersection2 数据(包括 3.25 小时处的新样本,包含 NaN 值),请键入

tsc1.intersection2

删除缺失数据和对其进行插值

时序对象使用 NaN 来表示缺失数据。示例的此部分说明如何删除缺失数据或通过使用您为该时序指定的插值方法来对缺失数据进行插值。在将数据样本添加到时序集合对象中,您在 3.25 小时处向 tsc1 集合中添加了一个新数据样本。

由于 tsc1 集合有三个成员,因此在 3.25 小时处向一个成员添加数据样本时,也会向其他两个成员添加数据样本。但是,由于您未在 3.25 小时处为 intersection2intersection3 成员指定数据值,因此它们当前包含由 NaN 表示的缺失值。

删除缺失数据.  查找并删除 tsc1 集合中包含 NaN 值的数据样本。

tsc1 = delsamplefromcollection(tsc1,'index',...
       find(isnan(tsc1.intersection2.Data)));

该命令一次搜索一个 tscollection 成员 - 在本例中为 intersection2。如果在 intersection2 中找到缺失值,将从 tscollection全部成员中删除在该时间处的数据。

注意

请使用圆点表示法语法访问 tsc1 集合中 intersection2 成员的 Data 属性:

tsc1.intersection2.Data

有关 timeseries 属性的完整列表,请参阅时序属性

对缺失数据进行插值.  为了演示此示例,请在 intersection2intersection3 中重新引入 NaN 值。

tsc1 = addsampletocollection(tsc1,'time',3.25,...
       'intersection1',5);

使用当前时间向量 (tsc1.Time) 对 tsc1 中的缺失值进行插值。

tsc1 = resample(tsc1,tsc1.Time);

这会通过使用线性插值替换 intersection2intersection3 中的 NaN 值(线性插值是这些时序的默认插值方法)。

注意

圆点表示法 tsc1.Time 用于访问 tsc1 集合的 Time 属性。有关 tscollection 属性的完整列表,请参阅时序集合属性

例如,要查看插值后的 intersection2 数据,请键入

tsc1.intersection2

从 2.0 小时到 3.5 小时的新 tsc1 数据

小时

Intersection 1

Intersection 2

Intersection 3

2.0

7

13

11

2.5

7

15

15.5

3.0

14

17

20

3.25

5

16

17.3

3.5

14

15

14.5

从时序集合中删除时序

tscollection 对象 tsc1 中删除 intersection3 时序。

tsc1 = removets(tsc1,'intersection3')

现在列出了作为集合成员的两个时序。

将时间向量值显示为日期字符串

示例的此部分说明如何使用 MATLAB 日期字符串来控制数值时间向量的显示格式。有关 timeseriestscollection 对象支持的 MATLAB 日期字符串格式的完整列表,请参阅 timeseries 参考页中的时间向量定义。

要使用日期字符串,您必须设置 TimeInfo 属性的 StartDate 字段。时间向量中的所有值均使用 StartDate 作为参考日期转换为日期字符串。

假设参考日期发生在 2009 年 12 月 25 日。

tsc1.TimeInfo.Units = 'hours';
tsc1.TimeInfo.StartDate = '25-DEC-2009 00:00:00';

与您对 count1count2count3 时序对象的处理类似,将 tsc1 成员的数据单位设置为字符串 'car count'

tsc1.intersection1.DataInfo.Units = 'car count';
tsc1.intersection2.DataInfo.Units = 'car count';

绘制时序集合成员

要绘制时序集合中的数据,请逐个绘制其成员。

首先绘制 tsc1 成员 intersection1 的图形。

hold off
plot(tsc1.intersection1);

绘制时序集合的成员时,其时间单位显示在 x 轴上,其数据单位显示在 y 轴上。绘图标题显示为 'Time Series Plot:<member name>'

如果您使用相同的图窗绘制该集合中的其他成员,则不会显示注释。当 holdon 时,时序 plot 方法不会尝试更新标签和标题,因为序列的描述符可能不同。

在同一图窗中绘制 intersection1intersection2。防止覆盖绘图,但删除轴标签和标题。添加图例并设置线条序列的 DisplayName 属性以作为每个成员的标签。

plot(tsc1.intersection1,'-xb','Displayname','Intersection 1')
hold on
plot(tsc1.intersection2,'-.xm','Displayname','Intersection 2')
legend('show','Location','NorthWest')

绘图现在包括集合中的两个时序:intersection1intesection2。绘制第二个图会擦除第一个图上的标签。

最后,将 x 轴上的日期字符串更改为 hours,再次绘制这两个时序集合成员并包含图例。

指定集合的时间单位为 'hours'。

tsc1.TimeInfo.Units = 'hours';

指定时间显示格式。

tsc1.TimeInfo.Format = 'HH:MM';

用新时间单位重新创建上一个绘图。

hold off
plot(tsc1.intersection1,'-xb','Displayname','Intersection 1')

% Prevent overwriting plot, but remove axis labels and title.
hold on
plot(tsc1.intersection2,'-.xm','Displayname','Intersection 2')
legend('show','Location','NorthWest')

% Restore the labels with the |xlabel| and |ylabel| commands and overlay a
% data grid.
xlabel('Time (hours)')
ylabel('car count')
grid on

有关时序的绘图选项的详细信息,请参阅 timeseries

时序构造函数

在实现专门设计用于处理时序数据的各种 MATLAB 函数和方法之前,您必须创建一个 timeseries 对象来存储数据。有关 timeseries 对象构造函数语法,请参阅 timeseries

有关使用构造函数的示例,请参阅创建时序对象

时序属性

有关所有 timeseries 对象属性的说明,请参阅 timeseries。可以将 DataIsTimeFirstNameQualityTime 属性指定为构造函数中的输入参数。要分配其他属性,请使用 set 函数或圆点表示法。

注意

要从命令行获取属性信息,请在 MATLAB 提示符下键入 help timeseries/tsprops

有关编辑 timeseries 对象属性的示例,请参阅修改时序单位和插值方法

时序方法

有关所有时序方法的说明,请参阅 timeseries

时序集合构造函数

简介

MATLAB 对象 tscollection 是一个将使用相同时间向量的多个时序组合在一起的 MATLAB 变量。您包含在 tscollection 对象中的 timeseries 对象称为此集合的成员,这些成员具有若干个方法,可用于轻松地分析和处理 timeseries

时序集合构造函数语法

在实现专用于对 timeseries 对象的集合进行操作的 MATLAB 方法之前,您必须创建一个 tscollection 对象来存储数据。

下表总结了使用 tscollection 构造函数的语法。有关使用此构造函数的示例,请参阅创建时序集合对象

时序集合语法说明

语法

说明

tsc = tscollection(ts)

创建一个包含一个或多个 timeseries 对象的 tscollection 对象 tsc

ts 参数可以是以下项之一:

  • MATLAB 工作区中的单一 timeseries 对象

  • MATLAB 工作区中 timeseries 对象的元胞数组

timeseries 对象在 tscollection 中共享相同的时间向量。

tsc = tscollection(Time)

创建一个具有时间向量 Time 的空 tscollection 对象。

当时间值是日期字符串时,必须将 Time 指定为日期字符串的元胞数组。

tsc = tscollection(Time, TimeSeries, 'Parameter', Value, ...)

(可选)在 TimeTimeSeries 参数后输入以下参数-值对组:

时序集合属性

下表列出了 tscollection 对象的属性。可以将 NameTimeTimeInfo 属性指定为 tscollection 构造函数中的输入参数。

时序集合属性说明

属性

说明

Name

tscollection 对象名称,以字符串形式输入。该名称可以与 MATLAB 工作区中的 tscollection 变量名称不同。

Time

时间值向量。

TimeInfo.StartDate 为空时,使用指定单位相对于 0 测量 Time 的数值。如果定义了 TimeInfo.StartDate,则时间值表示相对于 StartDate 的以指定单位显示的日期字符串。

Time 的长度必须与每个 tscollection 成员的 Data 属性的第一个或最后一个维度匹配。

TimeInfo

使用以下字段存储有关 Time 的上下文信息:

  • Units - 时间单位,具有以下值:'weeks''days''hours''minutes''seconds''milliseconds''microseconds''nanoseconds'

  • Start - 开始时间

  • End - 结束时间(只读)

  • Increment - 两个后续时间值之间的间隔。当时间为非均匀采样时,增量为 NaN

  • Length - 时间向量的长度(只读)

  • Format - 定义日期字符串显示格式的字符串。有关详细信息,请参阅 MATLAB datestr 函数参考页。

  • StartDate - 定义参照日期的日期字符串。有关详细信息,请参阅 MATLAB setabstime 函数参考页。

  • UserData - 存储任何其他的用户定义信息

时序集合方法

常规时序集合方法.  使用以下方法来查询和设置对象属性以及绘制数据。

属性查询方法

方法

说明

get

查询 tscollection 对象属性值。

isempty

对于空 tscollection 对象,计算结果为 true

length

返回时间向量的长度。

plot

绘制集合中的时序。

set

设置 tscollection 属性值。

size

返回 tscollection 对象的大小。

数据和时间操作方法.  使用以下方法来添加或删除数据样本,以及操作 tscollection 对象。

操作数据和时间的方法

方法

说明

addts

timeseries 对象添加到 tscollection 对象。

addsampletocollection

将数据样本添加到 tscollection 对象。

delsamplefromcollection

tscollection 对象中删除一个或多个数据样本。

getabstime

将日期字符串时间向量从 tscollection 对象中提取到元胞数组。

getsampleusingtime

将现有 tscollection 对象中的数据样本提取到新 tscollection 对象中。

gettimeseriesnames

返回 tscollection 对象中时序名称的元胞数组。

horzcat

水平串联 tscollection 对象。将具有相同时间向量的若干 timeseries 对象合并到一个时序集合中。

removets

tscollection 对象中删除一个或多个 timeseries 对象。

resample

使用新时间向量选择 tscollection 对象中的数据或对其进行插值。

setabstime

tscollection 对象的时间向量中的时间值设置为日期字符串。

settimeseriesnames

更改 tscollection 对象中所选 timeseries 对象的名称。

vertcat

垂直串联 tscollection 对象。沿时间维度联接若干 tscollection 对象。