Windows版gnuplot对双文件数据做运算后绘图的时间匹配问题
gnuplot双文件时间匹配数值运算实现方案
核心问题梳理
- 时间格式不一致:文件1时间带秒、文件2时间仅到分钟,直接解析会出现时间戳不匹配
- 小数分隔符不一致:文件1用英文点、文件2用逗号,直接读取会识别为字符串无法计算
- 双文件数据对齐:仅需要对两个文件共有的时间戳做运算
实现代码(gnuplot 5.0及以上版本适用)
本方案用gnuplot原生关联数组存储文件2的时间-数值映射,读取文件1时自动匹配计算,适配后续文件2列数调整的需求。
# 1. 定义逗号小数转数值函数,解决文件2的分隔符问题 strtod(s) = real(strsubst(s, ",", ".")) # 2. 初始化关联数组,存储文件2的「分钟级时间戳: 目标列数值」映射 # 注意:文件2日期时间占2列,不计入时间的第5列对应总列号为7,后续列数增加修改此处列号即可 array arr[1000] # 可根据文件2的数据量调整大小,足够容纳即可 set table $dummy plot "你的文件2路径.txt" u (t=timecolumn(1, "%d/%m/%Y %H:%M"), arr[t] = strtod(strcol(7)), t) : (strtod(strcol(7))) w table unset table # 3. 配置全局时间参数,适配文件1的带秒时间格式 set xdata time set timefmt "%d/%m/%Y %H:%M:%S" set format x "%d/%m/%Y %H:%M" # X轴显示格式可自行调整 set xrange ["01/11/2021 00:00":"01/11/2021 03:00"] # 4. 读取文件1匹配计算并绘图 # 说明:文件1日期时间占2列,不计入时间的第2列对应总列号为3 plot "你的文件1路径.txt" u (\ t=timecolumn(1, "%d/%m/%Y %H:%M:%S"), \ t_min = strptime("%d/%m/%Y %H:%M", strftime("%d/%m/%Y %H:%M", t)), \ t_min \ ) : (\ exists(arr[t_min]) ? (column(3) - arr[t_min]) : NaN \ ) w linespoints title "差值(文件1第2列 - 文件2第5列)"
关键逻辑说明
- 读取文件2时单独指定到分钟的时间格式,避免和全局格式冲突,生成的时间戳直接作为数组key
- 读取文件1时自动将带秒的时间戳截断到分钟级,和文件2的key格式统一
- 不存在匹配时间戳时返回
NaN,gnuplot会自动跳过这些点,仅保留共有的时间戳运算结果 - 后续文件2列数调整时,仅需要修改第二步中
strcol(7)的列号即可,其余代码无需改动
内容的提问来源于stack exchange,提问作者ifffam
相关产品推荐
相关产品推荐

