Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

清理包含缺失、重复或不均匀时间的时间表

以下示例演示如何根据包含缺失、重复或不均匀时间的时间表来创建规则时间表。时间表是一种表类型,用于将时间戳或行时间与每一行数据进行关联。在规则时间表中,行时间会进行排序并且是唯一的,彼此相差相同的规则时间步。该示例还演示了如何导出时间表中的数据以供其他函数使用。

时间表可以是不规则的。它们可以包含不按行时间排序的行。时间表可以包含多个具有相同行时间的行,但是这些行可以具有不同的数据值。即使行时间已排序并且是唯一的,也会因不同大小的时间步而异。时间表甚至可以包含 NaTNaN 值以指示缺失的行时间。

时间表提供了很多种不同的方式来解决时间缺失、重复或不均匀的问题,以及对数据进行重采样或将数据聚合为规则行时间。

  • 要查找缺失的行时间,请使用 ismissing

  • 要删除缺失的时间和数据,请使用 rmmissing

  • 要按行时间对时间表进行排序,请使用 sortrows

  • 要使时间表具有唯一和已排序的行时间,请使用 uniqueretime

  • 要删除重复的时间,请指定一个唯一的时间向量并使用 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   

此方法只会删除包含缺失的行时间的行。表变量仍可能包含缺失的数据值。例如,对于 RainWindspeed 变量,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   

选择包含重复时间的第一行和最后一行

使用 uniqueretime 函数选择包含重复行时间的多行中的第一行和最后一行。

首先,使用 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
      ⋮

另请参阅

| | | | | | | | |

相关主题