Main Content

创建时间表

时间表是一种表类型,用于将时间与每一行进行关联。与表一样,时间表存储具有相同行数的列向数据变量。时间表将其行时间存储为由 datetimeduration 值组成的向量。此外,时间表支持特定于时间的函数,可对一个或多个时间表中的带时间戳的数据进行对齐、合并,以及执行计算。

在 MATLAB® 中,您可以通过下面几种方式创建时间表并为其分配数据。

  • 使用 timetable 函数从行时间向量和数据数组创建时间表。

  • 使用圆点表示法向现有时间表添加变量。

  • 向空时间表分配变量。

  • 预分配时间表,稍后再填入数据。

  • 使用 array2timetabletable2timetabletimeseries2timetable 函数将变量转换为时间表。

  • 使用 readtimetable 函数从文件中读取时间表。

  • 使用导入工具将您的数据作为表导入。然后使用 table2timetable 对其进行转换。

  • 对于 Simulink® 用户:使用 extractTimetable (Simulink) 函数从 Simulink.SimulationData.Dataset 对象中提取时间表。

您选择的方式取决于数据的性质以及您计划如何在代码中使用时间表。

从输入数组创建时间表

您可以使用 timetable 函数从行时间向量和数据数组创建时间表。例如,创建一个包含不同时间天气情况的时间表。

首先,创建一个行时间向量。此向量可以是 datetimeduration 向量。然后用温度、气压、降水量和暴风雨持续时间读数创建数据数组。

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 的值可以是 datetimeduration 标量。当指定 StartTime 时,您还必须指定 SampleRateTimeStep 来设置采样率或时间步。例如,使用从 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。该函数将表中的第一个 datetimeduration 变量转换为输出时间表中的行时间向量。

例如,创建一个包含 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。它将数值、日期时间以及字符串读入具有适当数据类型的变量。此处,LossCustomers 是数值数组。将输入文件的 OutageTimeRestorationTime 列作为 datetime 数组导入,因为 readtimetable 识别出了这些列中文本的日期时间格式。请注意,OutageTime 是输入文件中其值包含日期时间的第一列,因此 readtimetable 将其转换为输出时间表中的行时间向量。outages.csv 文件包含六列,但 readtimetable 将其转换为一个时间表,该时间表有一个行时间向量和五个变量。

outages = readtimetable("outages.csv",TextType="string")
outages=1468×5 timetable
         OutageTime           Region        Loss     Customers       RestorationTime             Cause      
    ____________________    ___________    ______    __________    ____________________    _________________

    01-Feb-2002 12:18:00    "SouthWest"    458.98    1.8202e+06    07-Feb-2002 16:50:00    "winter storm"   
    23-Jan-2003 00:49:00    "SouthEast"    530.14    2.1204e+05                     NaT    "winter storm"   
    07-Feb-2003 21:15:00    "SouthEast"     289.4    1.4294e+05    17-Feb-2003 08:14:00    "winter storm"   
    06-Apr-2004 05:44:00    "West"         434.81    3.4037e+05    06-Apr-2004 06:10:00    "equipment fault"
    16-Mar-2002 06:18:00    "MidWest"      186.44    2.1275e+05    18-Mar-2002 23:23:00    "severe storm"   
    18-Jun-2003 02:49:00    "West"              0             0    18-Jun-2003 10:54:00    "attack"         
    20-Jun-2004 14:39:00    "West"         231.29           NaN    20-Jun-2004 19:16:00    "equipment fault"
    06-Jun-2002 19:28:00    "West"         311.86           NaN    07-Jun-2002 00:51:00    "equipment fault"
    16-Jul-2003 16:23:00    "NorthEast"    239.93         49434    17-Jul-2003 01:12:00    "fire"           
    27-Sep-2004 11:09:00    "MidWest"      286.72         66104    27-Sep-2004 16:37:00    "equipment fault"
    05-Sep-2004 17:48:00    "SouthEast"    73.387         36073    05-Sep-2004 20:46:00    "equipment fault"
    21-May-2004 21:45:00    "West"         159.99           NaN    22-May-2004 04:23:00    "equipment fault"
    01-Sep-2002 18:22:00    "SouthEast"    95.917         36759    01-Sep-2002 19:12:00    "severe storm"   
    27-Sep-2003 07:32:00    "SouthEast"       NaN    3.5517e+05    04-Oct-2003 07:02:00    "severe storm"   
    12-Nov-2003 06:12:00    "West"         254.09    9.2429e+05    17-Nov-2003 02:04:00    "winter storm"   
    18-Sep-2004 05:54:00    "NorthEast"         0             0                     NaT    "equipment fault"
      ⋮

使用导入工具

最后,您可以使用导入工具以交互方式预览和导入电子表格、带分隔符的文本文件和等宽文本文件中的数据。然而,虽然导入工具能够以表形式导入数据,但无法以时间表形式直接导入数据。

如果您使用导入工具,请按照以下步骤创建时间表:

  1. 预览您的数据并将其作为表导入。

  2. 使用 table2timetable 函数转换导入的表。

另请参阅

函数

App

相关主题