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

如何在gnuplot中为stats函数设置时间范围计算区间均值

gnuplot stats按时间范围统计的正确写法

问题原因

  • stats默认不会自动将字符串格式的日期识别为时间轴,直接传入日期字符串作为范围会被当作普通数值处理,导致范围过滤失效,统计全列数据。
  • 你尝试的stats [...] u (timecolumn(1)):4写法报错undefined variable: A_mean,核心原因是没有跳过第一行表头,表头的非时间字符串解析失败导致stats运行异常,没有生成对应的统计变量。

正确实现代码

# plot data vs date 
reset session
FILE = "data_01.dat"

# 1. 定义时间格式,同时将统计范围的起止时间转为gnuplot内部时间戳
set timefmt "%m/%d/%Y"
start_6m = strptime("%m/%d/%Y", "8/1/2020")
end_6m = strptime("%m/%d/%Y", "1/1/2021")
start_12m = strptime("%m/%d/%Y", "8/1/2020")
end_12m = strptime("%m/%d/%Y", "8/1/2021")

# 2. 按时间范围过滤后统计,跳过第一行表头
stats FILE skip 1 u (timecolumn(1) >= start_6m && timecolumn(1) <= end_6m ? $4 : NaN) name "A" nooutput
stats FILE skip 1 u (timecolumn(1) >= start_12m && timecolumn(1) <= end_12m ? $4 : NaN) name "B" nooutput

# 3. 标签和绘图设置
set label 1  sprintf("6 months average= %.2f",A_mean) at graph 0.02, graph 0.95
set label 2  sprintf("12 months average= %.2f",B_mean) at graph 0.02, graph 0.90

set xdata time
set format x "%m/%y"
set xrange ["8/1/2020":"8/1/2021"]

plot FILE skip 1 u 1:4 w lp lc rgb 'blue' t 'data' ,\
     A_mean lc rgb 'black' t '6 months avg',\
     B_mean lc rgb 'red' t '12 months avg'

补充说明

  • 用strptime将日期字符串转为内部时间戳再做比较,避免字符串比较的逻辑错误。
  • 统计时通过三元运算符判断时间是否在目标区间,不符合的行返回NaN会被stats自动忽略,实现范围过滤效果。
  • 所有读取数据的操作(stats、plot)都统一加skip 1跳过表头,避免解析异常。
  • 加nooutput参数可以关闭stats的控制台日志输出,不需要可以删除该参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:42:01