retime
重采样或聚合时间表中的数据,并解决重复或不规则时间问题
语法
说明
TT2 = retime(
返回一个时间表,其中包含 TT1
,newTimeStep
,method
)TT1
中的变量和以时间步 newTimeStep
作为固定间隔的行时间。retime
函数使用 method
指定的函数对 TT1
的变量中的数据进行重采样或聚合。您可以使用 retime
执行以下操作:
在不同时间插入来自
TT1
的数据值。将数据聚合到时间 bin(例如,为了创建一个包含每月数据的季度均值的时间表)。
从
TT1
中删除具有重复行时间的行。将非规则时间表变成规则时间表,因为
newTimeStep
指定的是规则行时间。
newTimeStep
输入参量是指定预定义时间步的字符向量或字符串。例如,如果 newTimeStep
为 'daily'
而 method
为 'mean'
,则 TT2
包含 TT1
中的数据的日均值。
TT2
的第一个行时间位于 TT1
中最早的行时间之前的时间步。TT2
中的行时间涵盖 TT1
中的行时间范围。但是,TT2
可能不包含 TT1
的任何实际的行时间,因为可能 TT1
中包含的任何行时间都不在 TT2
的任何规则行时间内。
要对不同的变量使用不同的方法在 TT2
中插入或填入值,请指定 TT1
的 VariableContinuity
属性。有关详细信息,请参阅 使用不同的方法对时间表变量重设时间并进行同步。
要重采样或聚合来自多个时间表的数据,请参阅 synchronize
。
TT2 = retime(
使用 TT1
,newTimeStep
)'fillwithmissing'
方法调整时间表数据。如果 TT2
中的某个行时间与 TT1
中的任何行时间都不匹配,TT2
将在相应位置包含缺失数据指示符。
如果 TT1
包含具有重复行时间的行,而 TT2
具有与重复行时间匹配的行时间,则 TT2
将包含 TT1
中匹配的重复行时间的每个行组的第一行。
TT2 = retime(___,
使用由一个或多个 Name,Value
)Name,Value
对组指定的其他选项来调整时间表数据。您可以将此语法与前面任何语法中的输入参量结合使用。
示例
以小时为间隔对不规则时间表数据进行插值
创建近似以小时为间隔的时间表数据,但间隔不完全规则。对数据插值,使输出时间表的行时间具有规则的小时间隔。
Time = datetime({'2015-12-18 07:02:12';'2015-12-18 08:00:47';... '2015-12-18 09:01:37';'2015-12-18 10:03:10';... '2015-12-18 10:59:34'}); Temp = [37.3;41.9;45.7;42.3;39.8]; Pressure = [30.1;29.9;30.03;29.9;29.8]; TT = timetable(Time,Temp,Pressure)
TT=5×2 timetable
Time Temp Pressure
____________________ ____ ________
18-Dec-2015 07:02:12 37.3 30.1
18-Dec-2015 08:00:47 41.9 29.9
18-Dec-2015 09:01:37 45.7 30.03
18-Dec-2015 10:03:10 42.3 29.9
18-Dec-2015 10:59:34 39.8 29.8
要使用三次样条插值方法重采样,请指定 'spline'
。
TT2 = retime(TT,'hourly','spline')
TT2=5×2 timetable
Time Temp Pressure
____________________ ______ ________
18-Dec-2015 07:00:00 37.228 30.124
18-Dec-2015 08:00:00 41.824 29.899
18-Dec-2015 09:00:00 45.694 30.029
18-Dec-2015 10:00:00 42.552 29.91
18-Dec-2015 11:00:00 39.808 29.8
聚合时间表数据并计算均值
使用每十五分钟测量一次的温度和脉冲读数创建一个时间表。
Time = [minutes(0):minutes(15):minutes(105)]'; Temp = [98;97.5;97.9;98.1;97.9;98;98.3;97.8]; Pulse = [80;75;73;68;69;65;72;71]; TT = timetable(Time,Temp,Pulse)
TT=8×2 timetable
Time Temp Pulse
_______ ____ _____
0 min 98 80
15 min 97.5 75
30 min 97.9 73
45 min 98.1 68
60 min 97.9 69
75 min 98 65
90 min 98.3 72
105 min 97.8 71
以一小时为时间 bin,计算每个读数的均值。当您跨时间 bin 聚合数据时,输出时间表的行时间是时间 bin 的左边界。
TT2 = retime(TT,'hourly','mean')
TT2=2×2 timetable
Time Temp Pulse
______ ______ _____
0 min 97.875 74
60 min 98 69.25
指定您自己的时间步
创建一个时间表,其中包含大约每半小时测量一次的时间、温度和压力读数,但缺少上午 9:00 的测量值。
Time = datetime({'2015-12-18 07:29:53';'2015-12-18 08:00:00';... '2015-12-18 08:31:02';'2015-12-18 09:30:00'}); Temp = [37.3;41.9;45.7;39.8]; Pressure = [30.1;29.9;30.03;29.8]; TT1 = timetable(Time,Temp,Pressure)
TT1=4×2 timetable
Time Temp Pressure
____________________ ____ ________
18-Dec-2015 07:29:53 37.3 30.1
18-Dec-2015 08:00:00 41.9 29.9
18-Dec-2015 08:31:02 45.7 30.03
18-Dec-2015 09:30:00 39.8 29.8
指定 30 分钟的时间步。由于 30 分钟不是预定义的时间步,因此您必须使用 'TimeStep'
名称-值对组参量将其指定为持续时间值。使用线性插值对 TT1
的数据重采样。
dt = minutes(30); TT2 = retime(TT1,'regular','linear','TimeStep',dt)
TT2=6×2 timetable
Time Temp Pressure
____________________ ______ ________
18-Dec-2015 07:00:00 32.736 30.298
18-Dec-2015 07:30:00 37.318 30.099
18-Dec-2015 08:00:00 41.9 29.9
18-Dec-2015 08:30:00 45.573 30.026
18-Dec-2015 09:00:00 42.802 29.917
18-Dec-2015 09:30:00 39.8 29.8
指定采样率
使用数据的列向量创建时间表。行时间在 10 到 50 毫秒之间。
Intensity = [100 98.7 95.2 101.4 99.1]'; Time = milliseconds([11 20 34 40.3 49.9])'; TT1 = timetable(Time,Intensity)
TT1=5×1 timetable
Time Intensity
__________ _________
0.011 sec 100
0.02 sec 98.7
0.034 sec 95.2
0.0403 sec 101.4
0.0499 sec 99.1
使用 100 Hz 的采样率对 TT1
中的数据进行重采样。
TT2 = retime(TT1,'regular','linear','SampleRate',100)
TT2=5×1 timetable
Time Intensity
________ _________
0.01 sec 100.14
0.02 sec 98.7
0.03 sec 96.2
0.04 sec 101.1
0.05 sec 99.076
根据时间向量进行时间表数据插值
创建一个包含时间、温度和压力读数的时间表。
Time = datetime({'2015-12-18 07:29:53';'2015-12-18 08:00:00';... '2015-12-18 08:31:02';'2015-12-18 09:30:00'}); Temp = [37.3;41.9;45.7;39.8]; Pressure = [30.1;29.9;30.03;29.8]; TT1 = timetable(Time,Temp,Pressure)
TT1=4×2 timetable
Time Temp Pressure
____________________ ____ ________
18-Dec-2015 07:29:53 37.3 30.1
18-Dec-2015 08:00:00 41.9 29.9
18-Dec-2015 08:31:02 45.7 30.03
18-Dec-2015 09:30:00 39.8 29.8
创建一个时间向量并按向量中的时间对时间表数据进行插值。此时间向量在上午 8:00 开始。如果您使用 'TimeStep'
名称-值对组参量,则输出时间表将从上午 7:00 开始。使用时间向量的一个原因是确保输出时间表在您指定的时间开始和结束。
newTimes = [datetime('2015-12-18 08:00:00'):minutes(30):datetime('2015-12-18 09:30:00')]; TT2 = retime(TT1,newTimes,'linear')
TT2=4×2 timetable
Time Temp Pressure
____________________ ______ ________
18-Dec-2015 08:00:00 41.9 29.9
18-Dec-2015 08:30:00 45.573 30.026
18-Dec-2015 09:00:00 42.802 29.917
18-Dec-2015 09:30:00 39.8 29.8
通过插入缺失数据指示符来调整时间表
创建一个时间表,其中包含时间以及风速和方向测量值。
Time = datetime({'2015-12-18 07:00:00';'2015-12-18 08:03:47';... '2015-12-18 09:00:00';'2015-12-18 10:00:00';... '2015-12-18 10:59:34'}); WindSpeed = [13.4;6.5;7.3;8.5;2.3]; WindDirection = categorical({'NE';'N';'NE';'NW';'W'}); TT1 = timetable(Time,WindSpeed,WindDirection)
TT1=5×2 timetable
Time WindSpeed WindDirection
____________________ _________ _____________
18-Dec-2015 07:00:00 13.4 NE
18-Dec-2015 08:03:47 6.5 N
18-Dec-2015 09:00:00 7.3 NE
18-Dec-2015 10:00:00 8.5 NW
18-Dec-2015 10:59:34 2.3 W
将数据调整为每小时时间向量。如果 TT1
在每小时时间向量上没有数据,则在 TT2
中的相应位置插入缺失数据指示符。
TT2 = retime(TT1,'hourly')
TT2=5×2 timetable
Time WindSpeed WindDirection
____________________ _________ _____________
18-Dec-2015 07:00:00 13.4 NE
18-Dec-2015 08:00:00 NaN <undefined>
18-Dec-2015 09:00:00 7.3 NE
18-Dec-2015 10:00:00 8.5 NW
18-Dec-2015 11:00:00 NaN <undefined>
对时间表应用多种方法
加载时间表。使用 retime
函数调整时间表变量,并对不同的变量使用不同的方法。
加载包含波士顿气温、风速和降雨量测量值的时间表。
load bostonTT
Boston
Boston=6×3 timetable
Time Temp WindSpeed Rain
___________________ ____ _________ ____
2016-06-09 06:03:00 59.5 0.1 0.05
2016-06-09 12:00:23 63 2.3 0.08
2016-06-09 18:02:57 61.7 3.1 0.13
2016-06-10 06:01:47 55.4 5.7 0.15
2016-06-10 12:06:00 62.3 2.6 0.87
2016-06-10 18:02:57 58.8 6.2 0.33
调整数据以生成日平均气温、风速和日降雨量总和。retime
对所有时间表变量应用同一种方法。要应用不同的方法,请对时间表进行索引以选择变量,然后对您使用的每种方法调用 retime
。
BOS = Boston(:,{'Temp','WindSpeed'}); TT1 = retime(BOS,'daily','mean')
TT1=2×2 timetable
Time Temp WindSpeed
___________________ ______ _________
2016-06-09 00:00:00 61.4 1.8333
2016-06-10 00:00:00 58.833 4.8333
BOS = Boston(:,'Rain'); TT2 = retime(BOS,'daily','sum')
TT2=2×1 timetable
Time Rain
___________________ ____
2016-06-09 00:00:00 0.26
2016-06-10 00:00:00 1.35
要将所有结果合并到一个时间表中,可串联 TT1
和 TT2
。
TT = [TT1 TT2]
TT=2×3 timetable
Time Temp WindSpeed Rain
___________________ ______ _________ ____
2016-06-09 00:00:00 61.4 1.8333 0.26
2016-06-10 00:00:00 58.833 4.8333 1.35
包含时间 bin 的右边界
将时间表数据划分为若干以小时为单位的 bin。将时间 bin 的右边界(即结束时间)指定为行时间。默认情况下,时间 bin 的左边界(即开始时间)是行时间。
使用以十五分钟为间隔测量所得的温度和脉冲读数创建一个时间表。
Time = [minutes(15):minutes(15):minutes(105)]'; Temp = [97.5;97.9;98.1;97.9;98;98.3;97.8]; Pulse = [75;73;68;69;65;72;71]; TT = timetable(Time,Temp,Pulse)
TT=7×2 timetable
Time Temp Pulse
_______ ____ _____
15 min 97.5 75
30 min 97.9 73
45 min 98.1 68
60 min 97.9 69
75 min 98 65
90 min 98.3 72
105 min 97.8 71
以一小时为时间 bin,计算每个读数的均值。指定输出时间表的行时间是时间 bin 的右边界。由于包含右边界,因此在 60 分钟处的读数将包含在第一个 bin 中。
TT2 = retime(TT,'hourly','mean','IncludedEdge','right')
TT2=2×2 timetable
Time Temp Pulse
_______ ______ ______
60 min 97.85 71.25
120 min 98.033 69.333
以左边界为行时间来计算均值。这里的均值与 TT2
中的均值不同,因为在 60 分钟处的读数现在位于第二个时间 bin 中。
TT3 = retime(TT,'hourly','mean')
TT3=2×2 timetable
Time Temp Pulse
______ ______ _____
0 min 97.833 72
60 min 98 69.25
输入参数
TT1
— 输入时间表
时间表
输入时间表。
newTimeStep
— 输出时间表中用于确定时间间隔的时间步
字符向量
输出时间表中用于确定时间间隔的时间步,指定为字符向量。newTimeStep
可以是下表中列出的任何预定义时间步。
时间步 | 描述 |
---|---|
| 一年 |
| 一个季度 |
| 一个月 |
| 一周 |
| 一天 |
| 一小时 |
| 一分钟 |
| 一秒钟 |
dt
— 任意大小的时间步
日期时间标量 | 持续时间标量
任意大小的时间步,指定为日期时间标量或持续时间标量。
数据类型: datetime
| duration
| calendarDuration
Fs
— 采样率
正数值标量
采样率,指定为正数值标量。Fs
指定每秒采样数 (Hz)。
newTimes
— 新时间向量
日期时间向量 | 持续时间向量
新时间向量,指定为日期时间向量或持续时间向量。新时间向量必须为列向量。newTimes
的行数可以不同于 TT1
。
method
— 用于调整时间表数据的方法
字符向量 | 字符串标量 | 函数句柄
用于调整时间表数据的方法,指定为字符向量、字符串标量或函数句柄。您可以使用下面列出的任何方法调整 TT1
中的数据。
填充方法
当 TT2
的行时间与 TT1
的行时间匹配时,从 TT1
的行中复制数据。然后,用缺失数据指示符填充 TT2
中的其余行。
要用常量而不是缺失数据指示符填充其余的行,请将 method
指定为 'fillwithconstant'
并使用 'Constant'
名称-值对组参量。
方法 | 描述 |
---|---|
| 使用缺失数据指示符填充空缺(例如,使用 |
| 使用 |
最近邻方法
根据指定的方法,将 TT1
的行数据复制到 TT2
中行时间最接近匹配项的行。TT1
必须按行时间排序。
方法 | 描述 |
---|---|
| 从输入时间表中前一个最近邻项中复制数据,从行时间向量的末尾开始。如果存在重复的行时间,则 |
| 从输入时间表中后一个最近邻项中复制数据,从行时间向量的开头开始。如果存在重复的行时间,则 |
| 从输入时间表中的最近邻项中复制数据。 |
插值方法
将 TT1
的邻行中的数据值插入到 TT2
中。输入时间表的行时间必须有序且唯一。要控制如何在 TT1
的第一个和最后一个行时间之外进行数据外插,请使用 'EndValues'
名称-值对组参量。
方法 | 描述 |
---|---|
| 使用线性插值。 |
| 使用分段三次样条插值。 |
| 使用保形分段三次插值。 |
| 使用修正 Akima 三次 Hermite 插值。 |
聚合方法
在 TT2
的行时间指定的时间 bin 内聚合 TT1
的行中的数据。TT2
的每个行时间是时间 bin 的左边界,下一个连续的行时间为右边界。默认情况下,左边界包含在时间 bin 内。要控制时间 bin 是否包含左右边界,请使用 'IncludedEdge'
名称-值对组参量。
如果您指定时间向量 newTimes
,则 newTimes
必须按升序进行排序。
下面列出的所有方法都忽略 NaN
、NaT
和其他缺失数据指示符,但 func
除外。要包含缺失数据指示符,请将 func
作为函数句柄指定给函数,该函数将在聚合数据时包含缺失数据指示符。
方法 | 描述 |
---|---|
| 对每个时间 bin 内的值求和。 |
| 计算每个时间 bin 内的值的乘积。 |
| 计算每个时间 bin 内的值的均值。 |
| 计算每个时间 bin 内的值的中位数。 |
| 计算每个时间 bin 内的值的众数。 |
| 计算每个时间 bin 内的值的最小值。 |
| 计算每个时间 bin 内的值的最大值。 |
| 计算每个时间 bin 内有多少个值。 |
| 使用每个时间 bin 内的第一个值。 |
| 使用每个时间 bin 内的最后一个值。 |
| 使用函数句柄指定的函数(例如,使用 |
默认方法
默认方法等同于未指定 method
。
方法 | 描述 |
---|---|
| 用缺失数据指示符填充间隔,如果输入时间表的 |
名称-值参数
将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: TT2 = retime(TT1,newTimes,'Constant',-1)
创建时间表 TT2
,并将值 -1
赋给 TT2
中行时间与 TT1
中行时间不匹配的行中的元素。
Constant
— 当方法为 'fillwithconstant'
时用来填补空缺的值
数组
当方法为 'fillwithconstant'
时用来填补空缺的值,以逗号分隔的对组形式指定,该对组由 'Constant'
和一个数组组成。默认值为 0
。'Constant'
指定的值的数据类型必须与时间表变量的数据类型兼容。
示例: 当 TT2
中的所有变量都包含文本时,TT2 = retime(TT1,'hourly','fillwithconstant','Constant','NONE')
将用字符向量 'NONE'
填补 TT2
中的空缺。
EndValues
— 使用插值方法进行外插的方法
'extrap'
(默认) | 标量
使用插值方法时的外插方法,以逗号分隔的对组形式指定,该对组由 'EndValues'
和 'extrap'
或一个标量组成。如果指定标量,则其数据类型必须与所有时间表变量兼容。
方法 | 描述 |
---|---|
| 使用 |
标量 | 通过用标量填充输入行时间范围之外的空缺来进行外插 |
示例: 对于 TT2 = retime(TT1,'daily','previous','EndValues',1000)
来说,当 TT2
的行时间在 TT1
的行时间范围内时,它会用之前的行值填补 TT2
中的空缺;当 TT2
的行时间在该范围外时,它会用值 1000
填补空缺。
IncludedEdge
— 每个时间 bin 包含的边界
'left'
(默认) | 'right'
每个时间 bin 包含的边界,指定为逗号分隔的对组,其中包含 'IncludedEdge'
和 'left'
或 'right'
。TT2
的每个行时间是时间 bin 的左边界,下一个连续的行时间为右边界。
要包含的边界 | 描述 |
---|---|
| 所有 bin 都包含左边界,但最后一个 bin 除外,它同时包含左右边界 |
| 所有 bin 都包含右边界,但第一个 bin 除外,它同时包含左右边界 |
如果您指定 'left'
,则时间 bin 包含左边界,但最后一个 bin 除外,它同时包含左右边界。如果您指定 'right'
,则时间 bin 包含右边界,但第一个 bin 除外,它同时包含左右边界。
示例: TT2 = retime(TT1,'hourly','mean','IncludedEdge','right')
包含每个时间 bin 的右边界。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
不支持插值方法
'spline'
和'makima'
。不支持
'EndValues'
名称-值参量。不支持重新定时到
'regular'
间隔的行时间。对于方法
'nearest'
、'next'
和'previous'
,输入时间表中的所有变量必须支持缺失值(浮点、分类、日期时间、持续时间或文本)。
有关详细信息,请参阅tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
输出时间表的行时间被认为是不规则的,即使与具有规则时间步的行时间同步也是如此。
不支持
'makima'
插值方法。如果输入时间表的
VariableContinuity
属性不是常量,则此函数会忽略它。不支持
'weekly'
、'monthly'
和'quarterly'
时间步。如果输入时间表的行时间为
datetime
值,则也不支持'daily'
和'yearly'
时间步。
有关详细信息,请参阅Code Generation for Timetables (MATLAB Coder)和Timetable Limitations for Code Generation (MATLAB Coder)。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2016b 中推出R2021a: 'SamplingRate'
将被删除
'SamplingRate'
名称-值参量将在以后的版本中删除。请改用 'SampleRate'
。对应的时间表属性也命名为 SampleRate
。
为了实现向后兼容性,您仍可以将 'SamplingRate'
指定为名称-值参量形式的名称。但是,该值将赋给 SampleRate
属性。
R2021a: 'fillwithconstant'
方法将替换从输入时间表中提取的行中的缺失数据
如果输入时间表中有包含缺失数据值(如 NaN
)的行,并且这些行中的任一行包含在输出时间表中,则使用 'fillwithconstant'
方法会将这些缺失值替换为常量值。在以前的版本中,'fillwithconstant'
方法不会替换从输入时间表中提取的行中的缺失值。
例如,以下代码将创建一个时间表,其中第二行包含一个 NaN
值。
T = timetable(datetime("today") + [1 2 3]', [1 nan 2]')
T = 3×1 timetable Time Var1 ___________ ____ 20-Jan-2022 1 21-Jan-2022 NaN 22-Jan-2022 2
调用 retime
时使用此方法会将 NaN
替换为 0
。但在以前的版本中,此调用会在输出时间表中保留 NaN
。
T1 = retime(T,"daily","fillwithconstant","constant",0)
T1 = 3×1 timetable Time Var1 ___________ ____ 20-Jan-2022 1 21-Jan-2022 0 22-Jan-2022 2
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)