创建时间表
时间表是一种表类型,用于将时间与每一行进行关联。与表一样,时间表存储具有相同行数的列向数据变量。时间表将其行时间存储为由 datetime
或 duration
值组成的向量。此外,时间表支持特定于时间的函数,可对一个或多个时间表中的带时间戳的数据进行对齐、合并,以及执行计算。
在 MATLAB® 中,您可以通过下面几种方式创建时间表并为其分配数据。
使用
timetable
函数从行时间向量和数据数组创建时间表。使用圆点表示法向现有时间表添加变量。
向空时间表分配变量。
预分配时间表,稍后再填入数据。
使用
array2timetable
、table2timetable
和timeseries2timetable
函数将变量转换为时间表。使用
readtimetable
函数从文件中读取时间表。使用导入工具将您的数据作为表导入。然后使用
table2timetable
对其进行转换。对于 Simulink® 用户:使用
extractTimetable
(Simulink) 函数从Simulink.SimulationData.Dataset
对象中提取时间表。
您选择的方式取决于数据的性质以及您计划如何在代码中使用时间表。
从输入数组创建时间表
您可以使用 timetable
函数从行时间向量和数据数组创建时间表。例如,创建一个包含不同时间天气情况的时间表。
首先,创建一个行时间向量。此向量可以是 datetime
或 duration
向量。然后用温度、气压、降水量和暴风雨持续时间读数创建数据数组。
MeasurementTime = datetime(["2023-12-18 08:03:05"; "2023-12-18 10:03:17"; "2023-12-18 12:03:13"]); Temperature = [37.3; 39.1; 42.3]; Pressure = [29.4; 29.6; 30.0]; Precipitation = [0.1; 0.9; 0.0]; StormDuration = [hours(1); hours(2); NaN];
现在创建一个时间表作为数据的容器。timetable
函数使用输入参量变量名称作为时间表变量名称。此外,第一个输入参量提供行时间向量的名称。行时间向量不是时间表变量。相反,行时间是用来标记行的元数据,就像变量名称是用来标记变量的元数据一样。因此,得到的时间表是一个 3×4 时间表。
weather = timetable(MeasurementTime,Temperature,Pressure,Precipitation,StormDuration)
weather=3×4 timetable
MeasurementTime Temperature Pressure Precipitation StormDuration
____________________ ___________ ________ _____________ _____________
18-Dec-2023 08:03:05 37.3 29.4 0.1 1 hr
18-Dec-2023 10:03:17 39.1 29.6 0.9 2 hr
18-Dec-2023 12:03:13 42.3 30 0 NaN hr
您还可以使用 RowTimes
名称-值参量来指定行时间向量。当您使用此名称-值参量时,timetable
使用 Time
作为行时间向量的名称。
weather = timetable(Temperature,Pressure,Precipitation,StormDuration,RowTimes=MeasurementTime)
weather=3×4 timetable
Time Temperature Pressure Precipitation StormDuration
____________________ ___________ ________ _____________ _____________
18-Dec-2023 08:03:05 37.3 29.4 0.1 1 hr
18-Dec-2023 10:03:17 39.1 29.6 0.9 2 hr
18-Dec-2023 12:03:13 42.3 30 0 NaN hr
使用圆点表示法向时间表添加变量
创建时间表后,您可以随时使用圆点表示法添加新变量。圆点表示法按名称引用时间表变量,如 T.varname
,其中 T
是时间表,varname
是变量名称。
例如,将风速数组添加到 weather
。
w = [15; 27; 22.8]; weather.WindSpeed = w
weather=3×5 timetable
Time Temperature Pressure Precipitation StormDuration WindSpeed
____________________ ___________ ________ _____________ _____________ _________
18-Dec-2023 08:03:05 37.3 29.4 0.1 1 hr 15
18-Dec-2023 10:03:17 39.1 29.6 0.9 2 hr 27
18-Dec-2023 12:03:13 42.3 30 0 NaN hr 22.8
向空时间表添加变量
创建时间表的另一种方式是从仅包含行时间的空时间表开始,然后向它添加变量。例如,创建另一个版本的天气情况时间表。但这一次使用圆点表示法添加变量。
首先,仅使用行时间向量调用 timetable
,创建一个空时间表。结果是一个空时间表,因为它没有变量。
weather2 = timetable(MeasurementTime)
weather2 = 3x0 empty timetable MeasurementTime ____________________ 18-Dec-2023 08:03:05 18-Dec-2023 10:03:17 18-Dec-2023 12:03:13
(虽然您可以不带任何参量地调用 timetable
,但其结果是一个不包含行时间的空时间表。由此产生的 0×0 时间表用处不大,因为添加行时间比直接地创建一个包含行时间向量的空时间表效率更低。)
使用圆点表示法将变量添加到该空时间表中。时间表变量名称不必与工作区中的数组名称匹配,如下面对 WindSpeed
变量的赋值所示。
weather2.Temperature = Temperature; weather2.Pressure = Pressure; weather2.Precipitation = Precipitation; weather2.StormDuration = StormDuration; weather2.WindSpeed = w
weather2=3×5 timetable
MeasurementTime Temperature Pressure Precipitation StormDuration WindSpeed
____________________ ___________ ________ _____________ _____________ _________
18-Dec-2023 08:03:05 37.3 29.4 0.1 1 hr 15
18-Dec-2023 10:03:17 39.1 29.6 0.9 2 hr 27
18-Dec-2023 12:03:13 42.3 30 0 NaN hr 22.8
预分配时间表
如果您知道要存储在时间表中的数据的大小和数据类型,但您计划稍后对数据赋值,则更高效的做法是在时间表中预分配空间,然后对空行赋值。
例如,要为预计包含不同气象站的时间、温度和风速读数的一个 4×3 时间表预分配空间,请使用 timetable
函数。您必须提供行时间,以便按行时间通过下标对时间表进行索引。但不提供输入数据数组,而是指定时间表变量的大小和数据类型。要为它们提供名称,请指定 VariableNames
名称-值参量。预分配会用适合其数据类型的默认值填充时间表变量。
d = datetime(2023,6,1:4)'; sz = [4 3]; varTypes = ["double","double","string"]; varNames = ["Temperature","WindSpeed","Station"]; TT = timetable(Size=sz, ... VariableTypes=varTypes, ... RowTimes=d, ... VariableNames=varNames)
TT=4×3 timetable
Time Temperature WindSpeed Station
___________ ___________ _________ _________
01-Jun-2023 0 0 <missing>
02-Jun-2023 0 0 <missing>
03-Jun-2023 0 0 <missing>
04-Jun-2023 0 0 <missing>
您可以一次只对一行分配数据。将数据值行指定为元胞数组。
TT(datetime("2023-06-01"),:) = {48.2,13.33,"S1"}
TT=4×3 timetable
Time Temperature WindSpeed Station
___________ ___________ _________ _________
01-Jun-2023 48.2 13.33 "S1"
02-Jun-2023 0 0 <missing>
03-Jun-2023 0 0 <missing>
04-Jun-2023 0 0 <missing>
除了在预分配时间表时从向量提供行时间外,您也可以通过指定采样率或时间步来创建必要的行时间。默认情况下,这种时间表的行时间从 0 秒开始。例如,使用 TimeStep
名称-值参量预分配一个 3×2 时间表,其行时间的时间步为 0.1 秒。
TT = timetable(Size=[3 2], ... VariableTypes=["double","double"], ... TimeStep=seconds(0.1))
TT=3×2 timetable
Time Var1 Var2
_______ ____ ____
0 sec 0 0
0.1 sec 0 0
0.2 sec 0 0
要预分配一个其第一行的行时间不为 0 秒的时间表,请指定 StartTime
名称-值参量。StartTime
的值可以是 datetime
或 duration
标量。当指定 StartTime
时,您还必须指定 SampleRate
或 TimeStep
来设置采样率或时间步。例如,使用从 15 秒开始,以 1000 Hz 为采样率的行时间预分配一个时间表。
TT = timetable(Size=[3 3], ... VariableTypes=["uint64","double","double"], ... SampleRate=1000, ... StartTime=seconds(15))
TT=3×3 timetable
Time Var1 Var2 Var3
__________ ____ ____ ____
15 sec 0 0 0
15.001 sec 0 0 0
15.002 sec 0 0 0
将变量转换为时间表
创建时间表的另一种方式是转换数组或表。
例如,使用 array2timetable
函数将数组转换为时间表。指定开始时间和采样率以添加行时间。
X = rand(5,3); TT = array2timetable(X,StartTime=seconds(10),SampleRate=500)
TT=5×3 timetable
Time X1 X2 X3
__________ _______ _______ _______
10 sec 0.81472 0.09754 0.15761
10.002 sec 0.90579 0.2785 0.97059
10.004 sec 0.12699 0.54688 0.95717
10.006 sec 0.91338 0.95751 0.48538
10.008 sec 0.63236 0.96489 0.80028
当您使用 array2timetable
时,您可以指定采样率或者时间步(带不带开始时间皆可)。您也可以指定行时间向量。
同样,您可以使用 table2timetable
函数将表转换为时间表。例如,创建一个表,然后向其中添加行时间。
Reading1 = [98; 97.5; 97.9; 98.1; 97.9]; Reading2 = [120; 111; 119; 117; 116]; T = table(Reading1,Reading2)
T=5×2 table
Reading1 Reading2
________ ________
98 120
97.5 111
97.9 119
98.1 117
97.9 116
Time = seconds(1:1:5); TT = table2timetable(T,RowTimes=Time)
TT=5×2 timetable
Time Reading1 Reading2
_____ ________ ________
1 sec 98 120
2 sec 97.5 111
3 sec 97.9 119
4 sec 98.1 117
5 sec 97.9 116
使用 table2timetable
,您可以指定行时间向量,也可以指定采样率或者时间步(带不带开始时间皆可)。
但是,如果表已有日期时间,则可以不带其他参量地调用 table2timetable
。该函数将表中的第一个 datetime
或 duration
变量转换为输出时间表中的行时间向量。
例如,创建一个包含 datetime
变量的表。然后将其转换为时间表。虽然 T
是一个 3×4 表,但 TT
是一个 3×3 时间表,因为 MeasurementTime
成为 TT
中的行时间向量。
T = table(Temperature,Pressure,MeasurementTime,StormDuration)
T=3×4 table
Temperature Pressure MeasurementTime StormDuration
___________ ________ ____________________ _____________
37.3 29.4 18-Dec-2023 08:03:05 1 hr
39.1 29.6 18-Dec-2023 10:03:17 2 hr
42.3 30 18-Dec-2023 12:03:13 NaN hr
TT = table2timetable(T)
TT=3×3 timetable
MeasurementTime Temperature Pressure StormDuration
____________________ ___________ ________ _____________
18-Dec-2023 08:03:05 37.3 29.4 1 hr
18-Dec-2023 10:03:17 39.1 29.6 2 hr
18-Dec-2023 12:03:13 42.3 30 NaN hr
将 timeseries
数组转换为时间表
timeseries
数据类型是 MATLAB 中用来处理时间序列数据的另一种数据类型。timetable
数据类型是处理时间序列数据的推荐数据类型。要将 timeseries
数组转换为时间表,请使用 timeseries2timetable
函数。
如果输入是
timeseries
对象,则输出是具有一个变量的时间表。如果输入是一个
timeseries
对象数组,则输出就是一个包含多个变量的时间表。
例如,创建一个 timeseries
对象数组。将它转换为时间表。
ts1 = timeseries(rand(5,1),[0 10 20 30 40],Name="Series_1"); ts2 = timeseries(rand(5,1),[0 10 20 30 40],Name="Series_2"); ts3 = timeseries(rand(5,1),[0 10 20 30 40],Name="Series_3"); ts = [ts1 ts2 ts3]
1x3 timeseries array with properties: Events Name UserData Data DataInfo Time TimeInfo Quality QualityInfo IsTimeFirst TreatNaNasMissing Length
TT = timeseries2timetable(ts)
TT=5×3 timetable
Time Series_1 Series_2 Series_3
______ ________ ________ ________
0 sec 0.14189 0.65574 0.75774
10 sec 0.42176 0.035712 0.74313
20 sec 0.91574 0.84913 0.39223
30 sec 0.79221 0.93399 0.65548
40 sec 0.95949 0.67874 0.17119
从文件读取时间表
要将表格数据(例如 CSV(逗号分隔值)文件或 Excel® 电子表格)读入时间表,请使用 readtimetable
函数。
例如,示例文件 outages.csv
包含一组停电数据。outages.csv
的第一行为列名称。文件的其余部分包含每次停电的数据值(以逗号分隔)。此处显示了前几行。
Region,OutageTime,Loss,Customers,RestorationTime,Cause SouthWest,2002-02-01 12:18,458.9772218,1820159.482,2002-02-07 16:50,winter storm SouthEast,2003-01-23 00:49,530.1399497,212035.3001,,winter storm SouthEast,2003-02-07 21:15,289.4035493,142938.6282,2003-02-17 08:14,winter storm West,2004-04-06 05:44,434.8053524,340371.0338,2004-04-06 06:10,equipment fault MidWest,2002-03-16 06:18,186.4367788,212754.055,2002-03-18 23:23,severe storm ...
要将 outages.csv
中的数据导入时间表,请使用 readtimetable
。它将数值、日期时间以及字符串读入具有适当数据类型的变量。此处,Loss
和 Customers
是数值数组。将输入文件的 OutageTime
和 RestorationTime
列作为 datetime
数组导入,因为 readtimetable
识别出了这些列中文本的日期时间格式。请注意,OutageTime
是输入文件中其值包含日期时间的第一列,因此 readtimetable
将其转换为输出时间表中的行时间向量。outages.csv
文件包含六列,但 readtimetable
将其转换为一个时间表,该时间表有一个行时间向量和五个变量。
outages = readtimetable("outages.csv",TextType="string")
outages=1468×5 timetable
OutageTime Region Loss Customers RestorationTime Cause
________________ ___________ ______ __________ ________________ _________________
2002-02-01 12:18 "SouthWest" 458.98 1.8202e+06 2002-02-07 16:50 "winter storm"
2003-01-23 00:49 "SouthEast" 530.14 2.1204e+05 NaT "winter storm"
2003-02-07 21:15 "SouthEast" 289.4 1.4294e+05 2003-02-17 08:14 "winter storm"
2004-04-06 05:44 "West" 434.81 3.4037e+05 2004-04-06 06:10 "equipment fault"
2002-03-16 06:18 "MidWest" 186.44 2.1275e+05 2002-03-18 23:23 "severe storm"
2003-06-18 02:49 "West" 0 0 2003-06-18 10:54 "attack"
2004-06-20 14:39 "West" 231.29 NaN 2004-06-20 19:16 "equipment fault"
2002-06-06 19:28 "West" 311.86 NaN 2002-06-07 00:51 "equipment fault"
2003-07-16 16:23 "NorthEast" 239.93 49434 2003-07-17 01:12 "fire"
2004-09-27 11:09 "MidWest" 286.72 66104 2004-09-27 16:37 "equipment fault"
2004-09-05 17:48 "SouthEast" 73.387 36073 2004-09-05 20:46 "equipment fault"
2004-05-21 21:45 "West" 159.99 NaN 2004-05-22 04:23 "equipment fault"
2002-09-01 18:22 "SouthEast" 95.917 36759 2002-09-01 19:12 "severe storm"
2003-09-27 07:32 "SouthEast" NaN 3.5517e+05 2003-10-04 07:02 "severe storm"
2003-11-12 06:12 "West" 254.09 9.2429e+05 2003-11-17 02:04 "winter storm"
2004-09-18 05:54 "NorthEast" 0 0 NaT "equipment fault"
⋮
使用导入工具
最后,您可以使用导入工具以交互方式预览和导入电子表格、带分隔符的文本文件和等宽文本文件中的数据。然而,虽然导入工具能够以表形式导入数据,但无法以时间表形式直接导入数据。
如果您使用导入工具,请按照以下步骤创建时间表:
预览您的数据并将其作为表导入。
使用
table2timetable
函数转换导入的表。