问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MATLAB表格Table与时间序列Timetable的高效操作方法

创作时间:
作者:
@小白创作中心

MATLAB表格Table与时间序列Timetable的高效操作方法

引用
CSDN
1.
https://blog.csdn.net/weixin_31268759/article/details/146055858

MATLAB中的表格(Table)和时间序列(Timetable)是处理结构化数据和时间相关数据的核心工具。本文从基础操作到高级技巧,详细介绍了其使用方法,包括创建、数据筛选、增删改、重采样与统计等多个方面,并提供了具体的代码示例。

一、创建与基础操作

1. 表格(Table)的创建与访问

创建表格:

% 定义列数据
Name = {'Alice'; 'Bob'; 'Charlie'};
Age = [25; 30; 35];
Employed = logical([1; 0; 1]); % 逻辑类型
% 创建表格
myTable = table(Name, Age, Employed); 
disp(myTable)  

访问数据:

  • 按列名访问
    myTable.Name

    myTable.('Name')

  • 按行、列索引

% 获取第一行所有列数据
row1 = myTable(1, :); 
% 获取第2到3行的'Age'列
subset = myTable(2:3, 'Age');  

2. 时间序列(Timetable)的创建与访问

创建Timetable:

% 定义时间戳(规则时间)
Time = datetime('2023-01-01 08:00:00') + seconds(0:2)';
Data = [1.2; 3.4; 5.6];
% 创建Timetable
myTT = timetable(Time, Data);
disp(myTT)  

访问特定时间点数据:

% 提取特定时间的数据
row = myTT(myTT.Time == datetime('2023-01-01 08:00:01'), :);  

二、数据筛选与查询

1. 表格的条件筛选

% 筛选条件:年龄大于30且被雇佣
selectedRows = myTable(myTable.Age > 30 & myTable.Employed, :);  

2. 时间序列的时间范围筛选

  • 使用 timerange 函数
% 筛选时间范围内的数据
tt_sub = myTT(timerange('2023-01-01 08:00:00', '2023-01-01 08:00:02'), :);  
  • 使用时间容忍度(WithTol)(适合非精确匹配):
% 忽略时间点±2秒误差
tt_sub = myTT(withtol(datetime('2023-01-01 08:00:01'), seconds(2)), :);  

三、数据增删改

1. 新增或删除列

% 新增列
myTable.Salary = [50000; 60000; 75000];
% 删除'Employed'列
myTable = removevars(myTable, 'Employed');  

2. 合并表格或时间序列

  • 垂直合并(追加行)
newData = table({'David'}, 28, 'VariableNames', {'Name', 'Age'});
myTable = vertcat(myTable, newData);  
  • 水平合并(添加列)
extraInfo = table([70; 80; 90], 'VariableNames', {'Weight'});
myTable = [myTable, extraInfo];  
  • 基于时间的合并(Timetable)
% 同步两个时间序列
syncedTT = synchronize(myTT1, myTT2);  

四、高级操作:重采样与统计

1. 时间序列重采样

  • 降采样(聚合)
% 每2秒计算一次数据的平均值
tt_resampled = retime(myTT, 'regular', 'mean', 'TimeStep', seconds(2));  
  • 填充缺失值
% 填充前向数据(使用线性插值)
tt_filled = retime(myTT, 'regular', 'linear', 'TimeStep', seconds(1));  

2. 表格的统计计算

% 按分组计算平均年龄(如按某列分组)
groupStats = groupsummary(myTable, 'GroupColumn', 'mean', 'Age');  

五、性能优化技巧

1. 避免循环,使用向量化操作

% 直接计算新列(非循环)
myTable.DoubleAge = myTable.Age * 2;  

2. 优化数据类型节省内存

  • 将字符串分类变量转换为 categorical 类型:
myTable.Name = categorical(myTable.Name);  

3. 预分配内存

在循环外预先分配足够大的表格:

% 预定义表格大小
outputTable = table('Size',[1000, 3], 'VariableTypes', {'string', 'double', 'logical'});  

六、常见问题与处理

1. 时间戳不唯一

  • 检测重复时间:
isDuplicate = duplicated(myTT.Time);  
  • 通过 retime 合并处理:
% 对重复时间取平均值
tt_unique = retime(myTT, 'regular', 'mean', 'TimeStep', seconds(1));  

2. 缺失值处理

  • 删除含有NaN的行:
myTable = rmmissing(myTable);  
  • 填充缺失数据:
myTable = fillmissing(myTable, 'linear');  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号