You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab多文件连续非重叠时间序列绘图及代码优化求助

Matlab处理连续空气采样数据的优化方案

问题描述

我正在用Matlab编写代码读取空气采样仪器生成的逐日数据文件,目前遇到两个问题:

  • 绘图时多日数据重叠,需要生成连续的扩展时间序列图(每个数据文件的第二列是hr:min:sec格式的时间)
  • 导入数据及清理空值的代码过于冗余,无法高效处理数月的批量数据

现有代码如下:

% importing data 
A101 = readtable("AE33_AE33-S10-01288_20220101.dat");
A102 = readtable("AE33_AE33-S10-01288_20220102.dat");
A103 = readtable("AE33_AE33-S10-01288_20220103.dat");
A104 = readtable("AE33_AE33-S10-01288_20220104.dat");

% removing empty cells
A101=A101(~any(ismissing(A101),2),:);
A102=A102(~any(ismissing(A102),2),:);
A103=A103(~any(ismissing(A103),2),:);
A104=A104(~any(ismissing(A104),2),:);

% times 
t1 = A101{:,2};
t2 = A102{:,2};
t3 = A103{:,2};
t4 = A104{:,2};
% BC data for each day 
b = A101{:,56};
c = A102{:,56};
d = A103{:,56};
e = A104{:,56};
% plotting 
plot(t1, b, t2, c, t3, d, t4, e); 
title('BC concentration');
xlabel('Time (hours)');
ylabel('BC concentration (ng/m3)');
ylim([0,1600]);
legend({'1/01', '1/02', '1/03', '1/04'}) 

优化方案

1. 简化批量数据导入与空值清理

利用循环自动处理任意时间段的文件,避免重复代码:

% 设置日期范围(示例为2022年1月1日至1月4日)
startDate = datetime(2022,1,1);
endDate = datetime(2022,1,4);
dateRange = startDate:days(1):endDate;

allData = table();

for dt = dateRange
    % 按命名规则生成文件名
    dateStr = char(datetime(dt,'Format','yyyyMMdd'));
    fileName = sprintf("AE33_AE33-S10-01288_%s.dat", dateStr);
    
    % 读取并清理数据
    if isfile(fileName)
        tempTable = readtable(fileName);
        % 移除含空值的行
        tempTable = tempTable(~any(ismissing(tempTable),2),:);
        % 添加日期列,用于后续合并完整时间戳
        tempTable.Date = repmat(dt, height(tempTable), 1);
        % 合并到总数据表
        allData = [allData; tempTable];
    end
end

2. 生成连续时间序列图

将文件内的hr:min:sec与日期合并为完整时间戳,解决数据重叠问题:

% 合并日期和时间列,生成连续的datetime对象
allData.FullTime = allData.Date + duration(allData{:,2});

% 提取第56列的BC浓度数据
bcData = allData{:,56};

% 绘制连续时间序列图
figure;
plot(allData.FullTime, bcData, 'LineWidth',1);
title('BC浓度连续时间序列');
xlabel('时间');
ylabel('BC浓度 (ng/m3)');
ylim([0,1600]);
% 按日期添加x轴刻度,提升可读性
xticks(startDate:days(1):endDate);
xticklabels(datestr(startDate:days(1):endDate,'mm/dd'));

关键说明

  • 批量适配:只需修改startDate和endDate,即可处理从几天到数月的所有数据,无需手动编写重复导入代码
  • 空值统一处理:在循环内完成空值清理,代码复用性强
  • 连续时间轴:通过datetime+duration合并生成完整时间戳,彻底解决多日数据重叠问题,时间轴逻辑清晰
  • 可扩展性:如果后续需要添加其他数据列处理,直接在循环内或总表操作即可

内容的提问来源于stack exchange,提问作者livlh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:11:02