如何在Octave中合并不同长度时间序列并为空缺日期补零
在Octave中按日期合并两个长度不同的时间序列(缺失值补零)
要实现将两个维度为[n,2]和[m,2]的时间序列按日期合并、缺失值补零的需求,intersect仅保留共同日期无法满足要求,需要基于日期并集构建结果,具体步骤如下:
假设数据已加载
假设你已将两组数据导入Octave,分别存储为:
data1:第一组数据,第一列为日期字符串,第二列为Difference数值data2:第二组数据,第一列为日期字符串,第二列为Temperature数值
完整实现代码
% 1. 将日期字符串转换为数值格式(消除字符串匹配误差) date_fmt = 'yyyy-mm-dd HH:MM:SS'; date1_num = datenum(data1(:,1), date_fmt); date2_num = datenum(data2(:,1), date_fmt); % 2. 获取所有唯一日期(两个数据集的日期并集) all_dates_num = unique([date1_num; date2_num]); all_dates_str = datestr(all_dates_num, date_fmt); % 3. 初始化结果矩阵 result_rows = length(all_dates_num); result = zeros(result_rows, 3); result(:,1) = all_dates_num; % 暂存日期数值 % 4. 填充Temperature列(无匹配则补0) for i = 1:result_rows match_idx = find(date2_num == all_dates_num(i)); result(i,2) = isempty(match_idx) ? 0 : data2(match_idx, 2); end % 5. 填充Difference列(无匹配则补0) for i = 1:result_rows match_idx = find(date1_num == all_dates_num(i)); result(i,3) = isempty(match_idx) ? 0 : data1(match_idx, 2); end % 6. 格式化输出结果 header = {'DATE:', 'Temperature', 'Difference'}; fprintf('%22s %15s %15s\n', header{:}); for i = 1:result_rows fprintf('%22s %15.4f %15.4f\n', all_dates_str(i,:), result(i,2), result(i,3)); end
代码说明
- 日期格式转换:用
datenum将字符串日期转为数值,确保日期能准确比对,避免字符串匹配的精度问题。 - 获取日期并集:通过
unique合并两个数据集的日期并去重,得到所有需要保留的日期条目。 - 缺失值补零:遍历每个唯一日期,在对应数据集中查找匹配项,存在则取对应数值,不存在则填充0。
- 格式化输出:将数值日期转回字符串,按表格格式打印输出,与你期望的结果格式一致。
适配示例数据效果
用你提供的示例数据测试时,输出结果会包含所有日期:
- 2020-10-18的日期仅存在于第二组,对应
Difference列补0 - 2020-10-26的日期仅存在于第一组,对应
Temperature列补0
内容的提问来源于stack exchange,提问作者user1669504
相关产品推荐
相关产品推荐

