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

