星星博客 »  > 

MATLAB 基础知识 数据类型 时间表 清理包含缺失、重复或不均匀时间的时间表

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

时间表可以是不规则的。它们可以包含不按行时间排序的行。时间表可以包含多个具有相同行时间的行,但是这些行可以具有不同的数据值。即使行时间已排序并且是唯一的,也会因不同大小的时间步而异。时间表甚至可以包含 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

相关文章