Main Content

在时间表中选择时间

时间表是一种表类型,用于将时间与每一行进行关联。您可以通过几种方式选择基于时间的数据子集:

  • 使用 timerangewithtol 函数查找特定范围内的时间。

  • 使用 datetime 数组的分量匹配重复出现的时间单位,如天或月。

  • 使用 retime 函数对数据进行重采样或分组。

例如,读取示例文件 outages.csv,其中包含 2002 年至 2014 年美国电力中断的数据。行时间向量 OutageTime 表示电力中断发生的时间。readtimetable 函数将其作为 datetime 数组导入。显示前五行。

TT = readtimetable('outages.csv');
head(TT,5)
       OutageTime          Region         Loss     Customers     RestorationTime            Cause       
    ________________    _____________    ______    __________    ________________    ___________________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'   }
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }
    2004-04-06 05:44    {'West'     }    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }

在 R2019a 之前,使用 readtable 读取表数据并使用 table2timetable 将其转换为时间表。

选择时间范围

要查找特定范围内的数据,您可以使用 timerange 函数,该函数定义基于时间的下标来进行索引。例如,定义 2008 年夏季,也就是从 6 月 20 日开始到 9 月 21 日结束,的范围。默认情况下,timerange 定义半开区间,左边关闭,右边打开,因此将结束日期指定为 9 月 22 日。

TR = timerange("2008-06-20","2008-09-22")
TR = 
	timetable timerange subscript:

		Select timetable rows with times in the half-open interval:
		  Starting at, including:   20-Jun-2008 00:00:00
		  Ending at, but excluding: 22-Sep-2008 00:00:00

找出在该范围内发生的电力中断,然后对受影响的客户数量绘制随时间变化的图。

summer08 = TT(TR,:);
stem(summer08.OutageTime,summer08.Customers)
ylabel("Customers")

Figure contains an axes object. The axes object with ylabel Customers contains an object of type stem.

在此时间范围内的几次电力中断对客户产生很大影响。将范围扩大到 2008 年全年,并寻找类似的高值数字。

TR = timerange("2008","years");
all08 = TT(TR,:);
high08 = all08(all08.Customers > 500000,:);

stem(high08.OutageTime,high08.Customers)
ylabel('Customers')

Figure contains an axes object. The axes object with ylabel Customers contains an object of type stem.

timerange 函数也有助于选择特定日期。通过比较 datetime 值来选择时间可能会产生错误结果,因为所有 datetime 值都包含日期时间分量。但是,当您仅指定 datetime 值的日期分量时,时间分量将设置为午夜。因此,虽然存在从 6 月 26 日以来的数据,但像这样的比较不会返回结果。

any(summer08.OutageTime == datetime("2008-06-26"))
ans = logical
   0

您可以改用 timerange

TR = timerange("2008-06-26","days");
june26 = summer08(TR,:)
june26=1×5 timetable
       OutageTime          Region         Loss     Customers    RestorationTime           Cause      
    ________________    _____________    ______    _________    ________________    _________________

    2008-06-26 22:36    {'NorthEast'}    425.21      93612      2008-06-27 06:53    {'thunder storm'}

定义范围的另一种方法是使用 withtol 指定一段时间内的容差。例如,查找从 2008 年夏天以来的行,其中 OutageTime 在 9 月 1 日劳动节的三天内。

WT = withtol("2008-09-01",days(3));
nearSep1 = summer08(WT,:)
nearSep1=4×5 timetable
       OutageTime          Region         Loss     Customers    RestorationTime            Cause       
    ________________    _____________    ______    _________    ________________    ___________________

    2008-09-01 23:35    {'SouthEast'}    206.27     2.27e+05                 NaT    {'equipment fault'}
    2008-09-01 00:18    {'MidWest'  }    510.05        74213    2008-09-01 14:07    {'thunder storm'  }
    2008-09-02 19:01    {'MidWest'  }       NaN    2.215e+05    2008-09-03 02:58    {'severe storm'   }
    2008-08-29 20:25    {'West'     }       NaN        31624    2008-09-01 01:51    {'wind'           }

匹配时间单位

您还可以使用 datetime 值的单位(如小时或天)来标识用于逻辑索引的行。这种方法对于指定周期性间隔很有用。

例如,查找 OutageTime 的值,其月份分量的值等于或小于 3,对应于每年的 1 月、2 月和 3 月。使用生成的逻辑数组对 TT 进行索引。

TR = (month(TT.OutageTime) <= 3);
winterTT = TT(TR,:);

head(winterTT,5)
       OutageTime          Region         Loss     Customers     RestorationTime          Cause      
    ________________    _____________    ______    __________    ________________    ________________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'}
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'}
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'}
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'}
    2005-02-04 08:18    {'MidWest'  }       NaN           NaN    2005-02-04 19:51    {'attack'      }

创建一个冬季时间原因的饼图。pie 函数只接受数值或 categorical 输入,因此首先将 Cause 转换为 categorical

winterTT.Cause = categorical(winterTT.Cause);
pie(winterTT.Cause)
title("Causes of Outages, January to March");

Figure contains an axes object. The hidden axes object with title Causes of Outages, January to March contains 16 objects of type patch, text. These objects represent attack, energy emergency, equipment fault, severe storm, thunder storm, unknown, wind, winter storm.

按时间段分组

retime 函数通过对值进行重采样或分组来调整行时间,以创建指定的间隔。其预定义间隔从秒到年不等,您可以指定如何处理间隔的缺失值或多个值。例如,您可以选择每周的第一个观测值,或对一个季度的观测值进行计数。

对于电力中断数据,您可以使用 retime 来查找每年的总数。首先,创建一个只包含数值变量的时间表。然后,调用 retime 并指定年度间隔,用总和组合多个值。输出中每年对应一个行,包含该年的总损失和受影响的客户总数。

numTT = TT(:,vartype("numeric"));
numTT = retime(numTT,"yearly","sum");
head(numTT,5)
       OutageTime       Loss     Customers 
    ________________    _____    __________

    2002-01-01 00:00    81335    1.3052e+07
    2003-01-01 00:00    58036     1.396e+07
    2004-01-01 00:00    51014    1.5523e+07
    2005-01-01 00:00    33980    8.7334e+06
    2006-01-01 00:00    35129    2.5729e+07

创建一个条形图,显示每年受影响的客户数量。

bar(numTT.OutageTime,numTT.Customers)
xlabel("Year")
ylabel("Customers")

Figure contains an axes object. The axes object with xlabel Year, ylabel Customers contains an object of type bar.

使用行时间计算持续时间

您可以将时间表的行时间与其他 datetimeduration 值结合使用来执行计算。例如,计算电力中断数据中列出的停电持续时间。然后计算每月电力中断持续时间的中位数并对其绘图。

首先,通过从 RestorationTime(即停电结束时间)中减去行时间(即停电开始时间),将电力中断持续时间添加到 TT。更改 OutageDuration 的格式,以天为单位显示电力中断的持续时间。显示 TT 的前五行。

TT.OutageDuration = TT.RestorationTime - TT.OutageTime;
TT.OutageDuration.Format = 'd';
head(TT,5)
       OutageTime          Region         Loss     Customers     RestorationTime            Cause           OutageDuration
    ________________    _____________    ______    __________    ________________    ___________________    ______________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }      6.1889 days 
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'   }         NaN days 
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }      9.4576 days 
    2004-04-06 05:44    {'West'     }    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}    0.018056 days 
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }      2.7118 days 

创建一个只包含电力中断持续时间的时间表。TT 中某些行的停电结束时间为缺失值 NaT,导致 OutageDuration 中出现 NaN 值。要从 medianTT 中删除 NaN 值,请使用 rmmissing 函数。然后使用 retime 计算每月电力中断持续时间中位数。显示 medianTT 的前五行。

medianTT = TT(:,"OutageDuration");
medianTT = rmmissing(medianTT); 
medianTT = retime(medianTT,'monthly',@median);
head(medianTT,5)
       OutageTime       OutageDuration
    ________________    ______________

    2002-02-01 00:00      6.1889 days 
    2002-03-01 00:00      2.7472 days 
    2002-04-01 00:00         NaN days 
    2002-05-01 00:00     0.72917 days 
    2002-06-01 00:00     0.22431 days 

创建每月电力中断持续时间中位数的阶梯图。

stairs(medianTT.OutageTime,medianTT.OutageDuration)
xlabel("Year")
ylabel("Median Duration (days)")

Figure contains an axes object. The axes object with xlabel Year, ylabel Median Duration (days) contains an object of type stair.

另请参阅

| | | | | | | | | | |

相关主题