gpt4 book ai didi

statistics - gnuplot 统计范围可能吗?

转载 作者:行者123 更新时间:2023-12-03 10:04:18 25 4
gpt4 key购买 nike

我希望 gnuplot 只对给定范围的数据执行统计功能。

我的数据如下:

24.12.2014-08:00,34,35,44
25.12.2014-08:00,33,35,44
26.12.2014-08:00,32,32,48
27.12.2014-08:00,31,36,41
28.12.2014-08:00,34,35,44

现在我的剧情脚本中有这个:

...
set datafile separator ","
stats 'out.csv' u 2 prefix "A"
set xdata time
set timefmt "%d.%m.%Y-%H:%M"
set format x "%d.%m"
set xrange["24.12.2014":"28.12.2014"]
set label 1 gprintf("Max = %g", A_max) font "-Bold" at "24.12.2014",A_max-1
...

但这会计算所有日期的统计数据。但我只需要从 26.12 到 28.12 的范围进行统计计算,而我的实际图表需要整个范围,因为我想在不同的时间段统计中拆分我的图表。

最佳答案

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 有一个时间列函数,可以将列读取为时间和日期。这为我们提供了一种更简单但不一定那么强大的替代方法。

我们可以做到

set timefmt "%d.%m.%Y-%H:%M"
stats [startrange:endrange] 'out.csv' u (timecolumn(1)):2

这将使用 timefmt 读取第一列作为时间。

这个版本的工作原理与上面的类似,除了接受而不是拒绝结束范围值(如果我们需要对日期和时间进行更复杂的测试,上面的版本更强大)并且丢弃的值列为“超出范围” ”而不是“无效”。

我们还可以使用内联方式指定开始和结束范围

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 倾向于保持向后兼容性,并且单参数形式在上述情况下很有用(因此时间格式规范只能出现在脚本中的一个地方)。

关于statistics - gnuplot 统计范围可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36257643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com