Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

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 中插入或填入值,请指定 TT1VariableContinuity 属性。有关详细信息,请参阅 使用不同的方法对时间表变量重设时间并进行同步

要重采样或聚合来自多个时间表的数据,请参阅 synchronize

示例

TT2 = retime(TT1,'regular',method,'TimeStep',dt) 使用时间步 dt 计算具有固定间隔的行时间。dt 输入参数是标量持续时间或日历持续时间,用于指定任意大小的时间步。TT2 的行时间涵盖 TT1 的行时间范围。

当所需时间步不是可指定为字符向量或字符串的某一预定义时间步时,请使用此语法。

示例

TT2 = retime(TT1,'regular',method,'SampleRate',Fs) 使用采样率 Fs 计算采用固定间隔的行时间。Fs 输入参数是正数值标量,用于指定每秒的采样数 (Hz)。

示例

TT2 = retime(TT1,newTimes,method) 使用 method 指定的方法将时间表变量数据调整为时间向量 newTimesnewTimes 时间向量可以是不规则的,但必须为有序的日期时间或持续时间向量,且包含唯一值。newTimes 中的时间变成 TT2 的行时间。

示例

TT2 = retime(TT1,newTimeStep) 使用 'fillwithmissing' 方法调整时间表数据。如果 TT2 中的某个行时间与 TT1 中的任何行时间都不匹配,TT2 将在相应位置包含缺失数据指示符。

如果 TT1 包含具有重复行时间的行,而 TT2 具有与重复行时间匹配的行时间,则 TT2 将包含 TT1 中匹配的重复行时间的每个行组的第一行。

TT2 = retime(TT1,'regular','TimeStep',dt) 使用时间步 dt 计算采用固定间隔的行时间,并在需要时插入缺失数据指示符。

TT2 = retime(TT1,'regular','SampleRate',Fs) 使用采样率 Fs 计算采用固定间隔的行时间,并在需要时插入缺失数据指示符。

TT2 = retime(TT1,newTimes) 返回一个时间表,其中包含 newTimesTT1 中的行时间不匹配时的缺失数据指示符。

示例

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

要将所有结果合并到一个时间表中,可串联 TT1TT2

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 的左边界(即开始时间)是行时间。

使用以十五分钟为间隔测量所得的温度和脉冲读数创建一个时间表。

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

输入参数

全部折叠

输入时间表。

输出时间表中用于确定时间间隔的时间步,指定为字符向量。newTimeStep 可以是下表中列出的任何预定义时间步。

时间步

描述

'yearly'

一年

'quarterly'

一个季度

'monthly'

一个月

'weekly'

一周

'daily'

一天

'hourly'

一小时

'minutely'

一分钟

'secondly'

一秒钟

任意大小的时间步,指定为日期时间标量或持续时间标量。

数据类型: datetime | duration | calendarDuration

采样率,指定为正数值标量。Fs 指定每秒采样数 (Hz)。

新时间向量,指定为日期时间向量或持续时间向量。新时间向量必须为列向量。newTimes 的行数可以不同于 TT1

用于调整时间表数据的方法,指定为字符向量、字符串标量或函数句柄。您可以使用下面列出的任何方法调整 TT1 中的数据。

填充方法

TT2 的行时间与 TT1 的行时间匹配时,从 TT1 的行中复制数据。然后,用缺失数据指示符填充 TT2 中的其余行。

要用常量而不是缺失数据指示符填充其余的行,请将 method 指定为 'fillwithconstant' 并使用 'Constant' 名称-值对组参数。

方法

描述

'fillwithmissing'

使用缺失数据指示符填充空缺(例如,使用 NaN 表示数值变量)。

'fillwithconstant'

使用 'Constant' 名称-值对组参数的值填充空缺。默认值为 0

最近邻方法

根据指定的方法,将 TT1 的行数据复制到 TT2 中行时间最接近匹配项的行。TT1 必须按行时间排序。

方法

描述

'previous'

从输入时间表中前一个最近邻项中复制数据,从行时间向量的末尾开始。如果存在重复的行时间,则 'previous' 是指最后一个重复项。

'next'

从输入时间表中后一个最近邻项中复制数据,从行时间向量的开头开始。如果存在重复的行时间,则 'next' 是指第一个重复项。

'nearest'

从输入时间表中的最近邻项中复制数据。

插值方法

TT1 的邻行中的数据值插入到 TT2 中。输入时间表的行时间必须有序且唯一。要控制如何在 TT1 的第一个和最后一个行时间之外进行数据外插,请使用 'EndValues' 名称-值对组参数。

方法

描述

'linear'

使用线性插值。

'spline'

使用分段三次样条插值。

'pchip'

使用保形分段三次插值。

'makima'

使用修正 Akima 三次 Hermite 插值。

聚合方法

TT2 的行时间指定的时间 bin 内聚合 TT1 的行中的数据。TT2 的每个行时间是时间 bin 的左边界,下一个连续的行时间为右边界。默认情况下,左边界包含在时间 bin 内。要控制时间 bin 是否包含左右边界,请使用 'IncludedEdge' 名称-值对组参数。

如果您指定时间向量 newTimes,则 newTimes 必须按升序进行排序。

下面列出的所有方法都忽略 NaNNaT 和其他缺失数据指示符,但 func 除外。要包含缺失数据指示符,请将 func 作为函数句柄指定给函数,该函数将在聚合数据时包含缺失数据指示符。

方法

描述

'sum'

对每个时间 bin 内的值求和。

'prod'

计算每个时间 bin 内的值的乘积。

'mean'

计算每个时间 bin 内的值的均值。

'median'

计算每个时间 bin 内的值的中位数。

'mode'

计算每个时间 bin 内的值的众数。

'min'

计算每个时间 bin 内的值的最小值。

'max'

计算每个时间 bin 内的值的最大值。

'count'

计算每个时间 bin 内有多少个值。

'firstvalue'

使用每个时间 bin 内的第一个值。

'lastvalue'

使用每个时间 bin 内的最后一个值。

@func

使用函数句柄指定的函数(例如,使用 @std 计算每个时间 bin 内的值的标准差)。func 必须返回标量或行向量输出参数,且必须接受空输入。

默认方法

默认方法等同于未指定 method

方法

描述

'default'(默认值)

用缺失数据指示符填充间隔,如果输入时间表的 VariableContinuity 属性针对每个变量指定了不同方法,则使用所指定的方法。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: TT2 = retime(TT1,newTimes,'Constant',-1) 创建时间表 TT2,并将值 -1 赋给 TT2 中行时间与 TT1 中行时间不匹配的行中的元素。

当方法为 'fillwithconstant' 时用来填补空缺的值,以逗号分隔的对组形式指定,该对组由 'Constant' 和一个数组组成。默认值为 0'Constant' 指定的值的数据类型必须与时间表变量的数据类型兼容。

示例: TT2 中的所有变量都包含文本时,TT2 = retime(TT1,'hourly','fillwithconstant','Constant','NONE') 将用字符向量 'NONE' 填补 TT2 中的空缺。

使用插值方法时的外插方法,以逗号分隔的对组形式指定,该对组由 'EndValues''extrap' 或一个标量组成。如果指定标量,则其数据类型必须与所有时间表变量兼容。

方法

描述

'extrap'(默认值)

使用 method 输入参数指定的方法进行外插

标量

通过用标量填充输入行时间范围之外的空缺来进行外插

示例: 对于 TT2 = retime(TT1,'daily','previous','EndValues',1000) 来说,当 TT2 的行时间在 TT1 的行时间范围内时,它会用之前的行值填补 TT2 中的空缺;当 TT2 的行时间在该范围外时,它会用值 1000 填补空缺。

每个时间 bin 包含的边界,指定为逗号分隔的对组,其中包含 'IncludedEdge''left''right'TT2 的每个行时间是时间 bin 的左边界,下一个连续的行时间为右边界。

要包含的边界

描述

'left'(默认值)

所有 bin 都包含左边界,但最后一个 bin 除外,它同时包含左右边界

'right'

所有 bin 都包含右边界,但第一个 bin 除外,它同时包含左右边界

如果您指定 'left',则时间 bin 包含左边界,但最后一个 bin 除外,它同时包含左右边界。如果您指定 'right',则时间 bin 包含右边界,但第一个 bin 除外,它同时包含左右边界。

示例: TT2 = retime(TT1,'hourly','mean','IncludedEdge','right') 包含每个时间 bin 的右边界。

扩展功能

版本历史记录

在 R2016b 中推出

全部展开