Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

在时间表中选择时间

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

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

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

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

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

TT = readtimetable('outages.csv');
head(TT,5)
ans=5×5 timetable
       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:
		[20-Jun-2008 00:00:00, 22-Sep-2008 00:00:00)

	See Select Timetable Data by Row Time and Variable Type.

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

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

Figure contains an axes. The axes 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. The axes 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)
ans=5×5 timetable
       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");

按时间段分组

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

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

numTT = TT(:,vartype("numeric"));
numTT = retime(numTT,"yearly","sum");
head(numTT,5)
ans=5×2 timetable
       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. The axes contains an object of type bar.

使用行时间计算持续时间

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

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

TT.OutageDuration = TT.RestorationTime - TT.OutageTime;
TT.OutageDuration.Format = 'd';
head(TT,5)
ans=5×6 timetable
       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)
ans=5×1 timetable
       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. The axes contains an object of type stair.

另请参阅

| | | | | | | | | | |

相关主题