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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:03