stats 函数不喜欢时间数据†,但您可以使用各种函数来强制它使用时间数据来操作时间。提供了两种执行此操作的方法。
方法一
startrange = strptime("%d.%m.%Y","26.12.2014")
endrange = strptime("%d.%m.%Y","29.12.2014")
validdate(x) = (curdate=strptime("%d.%m.%Y-%H:%M",x),curdate>=startrange&&curdate<endrange)
stats 'out.csv' u (validdate(strcol(1))?$2:1/0) prefix "A"
哪个产生
* FILE:
Records: 3
Out of range: 0
Invalid: 2
Blank: 0
Data Blocks: 1
* COLUMN:
Mean: 32.3333
Std Dev: 1.2472
Sample StdDev: 1.5275
Skewness: 0.3818
Kurtosis: 1.5000
Avg Dev: 1.1111
Sum: 97.0000
Sum Sq.: 3141.0000
Mean Err.: 0.7201
Std Dev Err.: 0.5092
Skewness Err.: 1.4142
Kurtosis Err.: 2.8284
Minimum: 31.0000 [1]
Maximum: 34.0000 [2]
Quartile: 31.0000
Median: 32.0000
Quartile: 34.0000
在您的示例数据上(前两行超出范围,后三行不在范围内)。这里我们强制超出范围的值无效,因此我们显示 0 超出范围。
其工作方式是我们使用 strptime 函数将日期转换为内部表示(在 gnuplot 5 中,这是自 Unix 纪元以来的秒数,是自 2000 年 1 月 1 日以来的秒数在之前的版本中)。因此,前两行获得了 2014 年 12 月 26 日午夜和 2014 年 12 月 29 日午夜的内部值(我们调整到第二天,以便我们可以将 12 月 28 日的所有时间都放在范围内)。
有效日期函数将感兴趣的日期转换为内部表示,并将其与这些标记进行比较。如果它在范围内,我们返回 1(真),如果不在范围内,我们返回 0(假)。请注意,第一个比较使用大于或等于来测试日期是否至少等于开始日期的午夜,第二个比较严格使用小于来检查日期是否在第二天开始之前。如果您在那些日子有特定的时间,可以进行轻微的修改。
最后,我们对条件值运行 stats 命令。如果第一列中的日期(我们需要使用 strcol 函数将其加载为字符串以提供给 validdate 函数)在范围内,我们使用第二列值。如果日期不在范围内,我们使用无效值 1/0。 stats 函数不会在其分析中使用无效值。
另外,如果更方便,我们可以在函数中接受开始和结束日期作为参数:
validdate(x,start,end) = (startrange=strptime("%d.%m.%Y",start),endrange=strptime("%d.%m.%Y",end),curdate=strptime("%d.%m.%Y-%H:%M",x),curdate>=startrange&&curdate<endrange)
然后调用统计函数
stats 'out.csv' u (validdate(strcol(1),"26.12.2014","29.12.2014")?$2:1/0) prefix "A"
方法二
Gnuplot 有一个 timecolumn 函数,可以将列读取为时间和日期。这为我们提供了一种更简单但不一定强大的替代方法。
我们可以的
set timefmt "%d.%m.%Y-%H:%M"
stats [startrange:endrange] 'out.csv' u (timecolumn(1)):2
这将使用 timefmt 将第一列读取为时间。‡
这个版本的工作原理与上面类似,除了 endrange 值被接受而不是被拒绝(如果我们需要对日期和时间进行更复杂的测试,上面的版本更强大)并且丢弃的值被列为“超出范围” 而不是“无效”。
我们还可以使用内联指定开始和结束范围
stats [strptime("%d.%m.%Y","26.12.2014"):strptime("%d.%m.%Y","29.12.2014")] 'out.csv' u (timecolumn(1)):2
† 请注意,您不能在时间模式下使用统计功能,否则只会报错。因此,上述代码必须在调用set xdata time 之前运行,或者在使用set xdata 恢复正常模式之后运行。
‡ 在版本 5 中,timecolumn 函数还可以采用一个附加参数来指定要使用的格式(例如 timecolumn(1,"%d.%m.%Y-%H:%M") 而不是使用 timefmt 命令,在这种情况下不需要)
请注意,在版本 5 中,仅记录了两个参数形式,并且文档中提到的一个参数形式仅作为以前的格式,而不是可接受的替代方案。单参数形式现在继续工作,但是,由于它仅作为以前的格式列出,而不是可接受的替代格式,单参数形式可能会在某些更高版本中停止工作。但是,我认为这不太可能,因为 gnuplot 倾向于保持向后兼容性,并且在上述情况下,一种参数形式很有用(因此时间格式规范只能出现在脚本中的一个位置)。