Skip to content

MATLAB - 时间表

MATLAB - 使用 Timetable 进行现代数据处理

Section titled “MATLAB - 使用 Timetable 进行现代数据处理”

timetable 是 MATLAB 中一种现代且高效的数据容器,在 R2016b 版本中引入。它专门为处理时间戳数据而设计。可以将其视为一种特殊的 table,其中每行都明确关联一个时间点。数据存储在面向列的变量中,这些变量可以具有不同的数据类型和大小,只要它们都具有相同的行数即可。Timetable 对于现代数据分析至关重要,提供了一套丰富的功能,可以轻松准确地对时间戳数据进行对齐、组合和计算。

Timetable 相对于旧方法(例如使用独立的时间和数据向量)的主要优势在于时间和数据是内在关联的。这可以防止数据-时间不匹配,并简化重采样和同步等复杂操作。Timetable 在实际应用中非常普遍:

  • 金融分析:存储和分析股票市场数据,这些数据本质上是时间相关的。您可以轻松地将逐笔交易数据重采样为每日间隔,或对齐来自不同股票的数据。
  • 医学研究:跟踪患者生命体征或随时间变化的实验结果。Timetable 使得分析来自多个受试者的数据变得容易,即使测量不是在精确的同一时刻进行的。
  • 环境科学:监测和评估来自传感器网络的环境数据,例如温度、湿度和污染物水平。
  • 工程和物联网:分析来自车辆、工业机械或智能设备的传感器数据。GPS 坐标、温度读数和压力值可以被清晰地组织和处理。

让我们深入探讨如何在现代 MATLAB 中创建和使用 timetable。

MATLAB 提供了几种灵活的方式来创建 timetable。最直接和推荐的方法是使用 timetable() 函数。

timetable() 构造函数是从头开始创建 timetable 的主要方法。

% 基本语法
TT = timetable(RowTimes, Var1, ..., VarN);
% 推荐的带有命名变量的语法
TT = timetable(RowTimes, Var1, ..., 'VariableNames', {'Name1', ...});

该函数创建一个 timetable,其中 RowTimes 是一个 datetime 或 duration 向量,提供每行的时间戳。数据变量 Var1, ..., VarN 可以是不同的类型(例如 double、string、cell),但它们都必须与 RowTimes 的长度具有相同的行数。最佳实践是在创建时显式命名变量以提高清晰度。

让我们创建一个 timetable 来存储气象数据。

% 1. 使用 datetime 数组定义时间戳
SampleTimes = datetime('2023-10-26 09:00:00') + hours(0:2)';
% 2. 定义数据变量
Temperature = [15.2; 16.1; 15.8]; % (摄氏度)
Humidity = [55.3; 52.1; 54.5]; % (百分比)
Conditions = ["Sunny"; "Sunny"; "Partly Cloudy"];
% 3. 使用命名变量创建 timetable
WeatherTT = timetable(SampleTimes, Temperature, Humidity, Conditions, ...
'VariableNames', {'TempC', 'Humidity', 'Conditions'})

在 MATLAB 中执行此代码将产生以下输出:

WeatherTT =
3×3 timetable
SampleTimes TempC Humidity Conditions
____________________ _____ ________ _________________
26-Oct-2023 09:00:00 15.2 55.3 "Sunny"
26-Oct-2023 10:00:00 16.1 52.1 "Sunny"
26-Oct-2023 11:00:00 15.8 54.5 "Partly Cloudy"

您还可以通过转换其他 MATLAB 数据类型来创建 timetable。

  • array2timetable():适用于快速将纯数值矩阵转换为 timetable,其中每列代表一个不同的变量。
  • table2timetable():将现有 table 转换为 timetable 的标准方法。源 table 必须包含一个 datetime 或 duration 变量作为行时间。

让我们首先创建一个常规 table,然后将其转换。

% 创建源 table
EventTime = datetime({'2023-01-01 09:00:00'; '2023-01-01 10:30:00'});
EventType = ["Start"; "Stop"];
EventValue = [100; 150];
T = table(EventTime, EventType, EventValue);
% 将 table 转换为 timetable
% MATLAB 自动检测 'EventTime' 列作为行时间。
TT = table2timetable(T)

输出将是一个 timetable,其中 EventTime 作为行时间向量,EventType 和 EventValue 作为数据变量。

在旧版 MATLAB 中,timeseries 对象曾被广泛使用。尽管出于向后兼容性考虑,您可以使用 timeseries2timetable() 将它们转换为 timetable,但此工作流程现在被视为旧版。对于所有新项目,您应直接创建和使用 timetable。

Timetable 的真正强大之处在于其用于索引、处理和同步时间戳数据的专用函数。

  • 索引:使用 timerange 按时间访问数据,或使用点表示法按变量名访问(例如 WeatherTT.TempC)。
  • 同步:使用 synchronize 组合两个 timetable,根据时间对齐它们的数据。这对于合并来自不同来源的数据非常强大。
  • 重采样:使用 retime 更改 timetable 的采样频率,例如,将逐分钟数据转换为每小时平均值。您可以指定聚合方法,如 'mean'(平均值)、'sum'(总和)或 'max'(最大值)。
% 创建高频 timetable
Times = datetime('now') + minutes(0:59)';
Data = rand(60, 1) * 10;
FineTT = timetable(Times, Data);
% 重采样为 15 分钟间隔,取平均值
CoarseTT = retime(FineTT, 'regular', 'mean', 'TimeStep', minutes(15))
  • 明确性:始终使用 'VariableNames' 属性清晰地命名您的变量。
  • 注意时区:datetime 对象可以是时区感知的。请保持时区一致性以避免错误,尤其是在合并来自不同地理位置的数据时。
  • 利用内置函数:在编写自定义循环之前,请检查 retime、synchronize 或 fillmissing 等内置函数是否可以完成任务。它们都经过了性能优化。
  • 向量化操作:一次性对整个 timetable 变量执行计算(例如 WeatherTT.TempF = WeatherTT.TempC * 9/5 + 32;),而不是逐行迭代。