本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。
以下示例演示如何根据包含缺失、重复或不均匀时间的时间表来创建规则时间表。时间表是一种表类型,用于将时间戳或行时间与每一行数据进行关联。在规则时间表中,行时间会进行排序并且是唯一的,彼此相差相同的规则时间步。该示例还演示了如何导出时间表中的数据以供其他函数使用。
时间表可以是不规则的。它们可以包含不按行时间排序的行。时间表可以包含多个具有相同行时间的行,但是这些行可以具有不同的数据值。即使行时间已排序并且是唯一的,也会因不同大小的时间步而异。时间表甚至可以包含 NaT
或 NaN
值以指示缺失的行时间。
时间表提供了很多种不同的方式来解决时间缺失、重复或不均匀的问题,以及对数据进行重采样或将数据聚合为规则行时间。
要查找缺失的行时间,请使用 ismissing
。
要删除缺失的时间和数据,请使用 rmmissing
。
要按行时间对时间表进行排序,请使用 sortrows
。
要使时间表具有唯一和已排序的行时间,请使用 unique
和 retime
。
要删除重复的时间,请指定一个唯一的时间向量并使用 retime
。
要创建规则时间表,请指定一个规则时间向量并使用 retime
。
从 MAT 文件 badTimes
加载一个样本时间表,其中包含在 2016 年 6 月 9 日的几个小时内获取的天气测量值。该时间表包含在当天不定时获取的温度、降雨量和风速测量值。
load badTimes
TT
TT=12×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
NaT 56 0 0
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 04:12:00 58.8 NaN NaN
删除将 NaT
或缺失值作为行时间的行。要查找行时间向量中的缺失值,请使用 ismissing
函数。ismissing
会返回一个逻辑向量,只要 TT.Time
具有缺失值,该向量即包含 1
。为时间表进行向后索引,以仅保留未将缺失值作为行时间的行。将这些行赋给 TT2
。
TF = ismissing(TT.Time); TT2 = TT(~TF,:); TT2
TT2=11×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 04:12:00 58.8 NaN NaN
此方法只会删除包含缺失的行时间的行。表变量仍可能包含缺失的数据值。例如,对于 Rain
和 Windspeed
变量,TT2
的最后一行包含 NaN
值。
您可以使用 rmmissing
函数删除缺失的行时间和缺失的数据值。rmmissing
会删除包含缺失的行时间、缺失的数据值或包含两者的任何时间表行。
显示 TT
中缺失的行时间和缺失的数据值。然后,从 TT
中删除所有缺失值。
TT
TT=12×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
NaT 56 0 0
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 04:12:00 58.8 NaN NaN
TT = rmmissing(TT)
TT=10×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
确定 TT
是否已排序。然后,使用 sortrows
函数根据行时间对时间表进行排序。
TF = issorted(TT)
TF = logical
0
TT = sortrows(TT)
TT=10×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
确定 TT
是否为规则时间表。规则时间表的连续行时间之间具有相同的时间间隔。即使是已排序的时间表,也可能具有不均匀的时间步。
TF = isregular(TT)
TF = logical
0
显示两个行时间之差。
diff(TT.Time)
ans = 9x1 duration
00:57:53
01:58:19
00:49:47
00:00:00
00:00:00
00:00:00
01:04:47
00:00:00
00:00:00
时间表可以包含重复的行。如果多个时间表行具有相同的行时间和相同的数据值,则这些时间表行是重复的。在此示例中,TT
的最后两行为重复的行。
要删除重复的行,请使用 unique
函数。unique
会返回唯一行,并按行时间对这些行进行排序。
TT = unique(TT)
TT=9×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
时间表可以具有行时间重复但数据值不同的行。在此示例中,TT
有几行的行时间相同但值不同。
查找包含重复的行时间的行。首先,对行时间进行排序并查找其间没有差异的连续时间。其间没有差异的时间为重复的时间。对行时间向量进行向后索引,并返回一组标识 TT
中的重复行时间的唯一时间。
dupTimes = sort(TT.Time); TF = (diff(dupTimes) == 0); dupTimes = dupTimes(TF); dupTimes = unique(dupTimes)
dupTimes = 2x1 datetime
09-Jun-2016 08:49:10
09-Jun-2016 09:53:57
为时间表进行索引以显示包含重复的行时间的行。当您对时间进行索引时,输出时间表中会包含具有匹配的行时间的所有行。
TT(dupTimes,:)
ans=6×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
使用 unique
和 retime
函数选择包含重复行时间的多行中的第一行和最后一行。
首先,使用 unique
函数创建一个由 TT
中的唯一行时间组成的向量。
uniqueTimes = unique(TT.Time);
从包含重复时间的每一组行中选择第一行。
TT2 = retime(TT,uniqueTimes)
TT2=5×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
从包含重复时间的每一组行中选择最后一行。为 retime
指定 'previous'
方法以复制最后一行中的数据。如果您指定 'previous'
,则 retime
会从行时间向量的末尾开始执行,并在遇到重复的行时间时停止。然后,它会复制该行中的数据。
TT2 = retime(TT,uniqueTimes,'previous')
TT2=5×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 09:53:57 67 0.03 3.4
聚合包含重复的行时间的行中的数据。例如,您可以计算同时获取的具有相同数量的多个测量值的均值。
使用 retime
函数计算包含重复行时间的行的平均温度、降雨量和风速。
TT = retime(TT,uniqueTimes,'mean')
TT=5×3 timetable
Time Temp Rain WindSpeed
____________________ _____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 71.75 0.01 2.7
09-Jun-2016 09:53:57 63 0.03 3.4
使用 retime
创建规则时间表。将数据插入到一个按小时计的规则时间向量中。要使用线性插值,请指定 'linear'
。TT
中的每个行时间都从整点时刻开始,并且连续的行时间之间的间隔为一小时。
TT = retime(TT,'hourly','linear')
TT=6×3 timetable
Time Temp Rain WindSpeed
____________________ ______ ________ _________
09-Jun-2016 05:00:00 65.826 0.0522 3.0385
09-Jun-2016 06:00:00 72.875 0.010737 2.3129
09-Jun-2016 07:00:00 66.027 0.044867 1.6027
09-Jun-2016 08:00:00 59.158 0.079133 0.9223
09-Jun-2016 09:00:00 70.287 0.013344 2.8171
09-Jun-2016 10:00:00 62.183 0.031868 3.4654
您可以指定自己的时间步,而不是使用诸如 'hourly'
等预定义的时间步。要指定 30 分钟的时间步,请使用 'regular'
输入参数和 'TimeStep'
名称-值对组参数。您可以指定任意大小的时间步作为持续时间或日历持续时间值。
TT = retime(TT,'regular','linear','TimeStep',minutes(30))
TT=11×3 timetable
Time Temp Rain WindSpeed
____________________ ______ ________ _________
09-Jun-2016 05:00:00 65.826 0.0522 3.0385
09-Jun-2016 05:30:00 69.35 0.031468 2.6757
09-Jun-2016 06:00:00 72.875 0.010737 2.3129
09-Jun-2016 06:30:00 69.451 0.027802 1.9578
09-Jun-2016 07:00:00 66.027 0.044867 1.6027
09-Jun-2016 07:30:00 62.592 0.062 1.2625
09-Jun-2016 08:00:00 59.158 0.079133 0.9223
09-Jun-2016 08:30:00 64.722 0.046239 1.8697
09-Jun-2016 09:00:00 70.287 0.013344 2.8171
09-Jun-2016 09:30:00 66.235 0.022606 3.1412
09-Jun-2016 10:00:00 62.183 0.031868 3.4654
您可以导出时间表数据供函数使用,以分析具有固定时间间隔的数据。例如,Econometrics Toolbox™ 和 Signal Processing Toolbox™ 带有可用于进一步分析固定间隔数据的函数。
提取时间表数据作为数组。当表变量可以串联时,您可以使用 Variables
属性以数组形式返回数据。
A = TT.Variables
A = 11×3
65.8260 0.0522 3.0385
69.3504 0.0315 2.6757
72.8747 0.0107 2.3129
69.4507 0.0278 1.9578
66.0266 0.0449 1.6027
62.5923 0.0620 1.2625
59.1579 0.0791 0.9223
64.7224 0.0462 1.8697
70.2868 0.0133 2.8171
66.2348 0.0226 3.1412
⋮
TT.Variables
等效于使用花括号语法 TT{:,:}
访问所有变量。
A2 = TT{:,:}
A2 = 11×3
65.8260 0.0522 3.0385
69.3504 0.0315 2.6757
72.8747 0.0107 2.3129
69.4507 0.0278 1.9578
66.0266 0.0449 1.6027
62.5923 0.0620 1.2625
59.1579 0.0791 0.9223
64.7224 0.0462 1.8697
70.2868 0.0133 2.8171
66.2348 0.0226 3.1412
⋮
diff
| fillmissing
| isregular
| issorted
| retime
| rmmissing
| sortrows
| table2timetable
| timetable
| unique