gpt4 book ai didi

gnuplot - 来自带有 unix 时间戳的 csv 多天同一分钟的最大值

转载 作者:行者123 更新时间:2023-12-01 12:05:34 24 4
gpt4 key购买 nike

我有一个带有 unix 时间戳列的 CSV,该列是在多日内收集的,每 5 分钟有一个数据行(我的光伏屋顶发电厂的输出日志)。

我想创建一个 24 小时的图表,显示所有天中每一分钟(第五分钟)的最大值。

这可以用 gnuplots 自己的功能来完成,还是我必须通过脚本在 gnuplot 之外进行处理?


You don't show how your exact data structure looks like, - theozh

这个文件相当大。我在这里举了一个例子:
http://www.filedropper.com/log-pv-20190607-20190811 (300kB)

我对第 4 列 (DC1 P) 和第 9 列 (DC2 P) 特别感兴趣。第 1 列 (Zeit) 包含 unix 时间戳。

最终目标是为 DC1 PDC2 P 分别绘制图表(颜色),但这是一个不同的问题...;o)

最佳答案

更新/修订:重新审视这个答案后,我想是时候进行清理和更简单的扩展解决方案了。经过一些迭代和澄清以及 OP 提供了一些数据(尽管链接不再有效)之后,我提出了一些可以改进的建议。

您可以在 gnuplot 中完成所有操作,无需外部工具!

如果您使用 with boxes 的绘图样式,绘制几天最大值的原始请求很容易。但这基本上只是一个图形解决方案。在那种情况下显然就足够了。但是,如果您对作为数字的最大值感兴趣,则需要付出更多的努力。

gnuplot 有选项smooth uniquesmooth frequency(查看help smooth)。有了这个,您可以轻松地分别获得平均值和总和,但是没有 smooth maxsmooth min。正如@meuh 建议的那样,您可以使用数组获得最大值或最小值,自 gnuplot 5.2.0 以来可用

脚本:(需要 gnuplot>=5.2.0)

### plot time data modulo 24h avg/sum/min/max
reset session

FILE = 'log-pv-20190607-20190811.csv'

set datafile separator comma
HeaderCount = 7
myTimeFmt = "%Y-%m-%d %H:%M:%S"

StartTime = ''
EndTime = ''
# if you don't define start/end time it will be taken automatically
if (StartTime eq '' || EndTime eq '') {
stats FILE u 1 skip HeaderCount nooutput
StartTime = (StartTime eq '' ? STATS_min : strptime(myTimeFmt,StartTime))
EndTime = (EndTime eq '' ? STATS_max : strptime(myTimeFmt,EndTime))
}

Modulo24Hours(t) = (t>=StartTime && t<=EndTime) ? (int(t)%86400) : NaN
set key noautotitle

set multiplot layout 3,2

set title "All data" offset 0,-0.5
set format x "%d.%m." timedate
set grid x,y
set yrange [0:]
myHeight = 1./3*1.1
set size 1.0,myHeight
plot FILE u 1:4:(tm_mday($1)) skip HeaderCount w l lc var
set multiplot next

set title "Data per 24 hours"
set format x "%H:%M" timedate
set xtics 3600*6
set size 0.5,myHeight
plot FILE u (Modulo24Hours($1)):4:(tm_mday($1)) skip HeaderCount w l lc var

set title "Average"
set size 0.5,myHeight
plot FILE u (int(Modulo24Hours($1))):4 skip HeaderCount smooth unique w l lc "web-green"

set title "Sum"
set size 0.5,myHeight
plot FILE u (int(Modulo24Hours($1))):4 skip HeaderCount smooth freq w l

set title "Min/Max"
set size 0.5,myHeight
N = 24*60/5
SecPerDay = 3600*24
array Min[N]
array Max[N]
do for [i=1:N] { Min[i]=NaN; Max[i]=0 } # initialize arrays
stats FILE u (idx=(int($1)%SecPerDay)/300+1, $4>Max[idx] ? Max[idx]=$4:0, \
Min[idx]!=Min[idx] ? Min[idx]=$4 : $4<Min[idx] ? Min[idx]=$4:0 ) skip HeaderCount nooutput

plot Min u ($1*300):2 w l lc "web-blue", \
Max u ($1*300):2 w l lc "red"

unset multiplot
### end of script

结果:

enter image description here

关于gnuplot - 来自带有 unix 时间戳的 csv 多天同一分钟的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57707947/

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