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
相关产品推荐
相关产品推荐

