Gnuplot跨24小时测量数据时间溢出问题解决求助
解决Gnuplot中24小时时钟溢出导致的曲线偏移问题
问题背景
对电池放电完成多组测量,计划用Gnuplot绘制放电曲线。其中一组(黄色曲线,对应0.5C放电)因开始时间过晚,出现24小时时钟溢出——数据包含从23:59:59跳转到00:00:00的时间点。使用现有代码绘图后,该组曲线出现负时间偏移,偏离了预期位于红色(1C)与黑色(0.2C)曲线之间的位置。需仅为该组数据添加时间偏移,且不影响其他组数据的绘图效果。
测量数据示例
Time;Voltage;Current;Charge;Power;Energy;Temperature ... 23:59:54;3.2387;0.6989;0.039;2.264;0.127;22.0 23:59:55;3.2387;0.6989;0.039;2.264;0.128;22.0 23:59:56;3.2387;0.6989;0.039;2.264;0.129;22.0 23:59:57;3.2387;0.6989;0.04;2.264;0.129;22.0 23:59:58;3.2387;0.6992;0.04;2.264;0.13;22.0 23:59:59;3.2386;0.6989;0.04;2.263;0.13;22.0 00:00:00;3.2386;0.6992;0.04;2.264;0.131;22.0 00:00:01;3.2386;0.6989;0.04;2.263;0.132;22.0 00:00:02;3.2386;0.6992;0.041;2.264;0.132;22.0 00:00:04;3.2386;0.6992;0.041;2.264;0.133;22.5 00:00:05;3.2386;0.6989;0.041;2.263;0.134;22.5 00:00:06;3.2386;0.6989;0.041;2.263;0.134;22.5 00:00:07;3.2386;0.6989;0.041;2.263;0.135;22.0
当前Gnuplot代码
set grid set title 'Entladungen der Batterie über Zeit' set tics nomirror set title font ",12" set ylabel 'U/V' font ",12" set key box font ",12" set xtics time set xlabel 'time' font ",12" set border 11 set border lw 2 set xtics font ",8" set term wxt size 1200, 460 myFmt = "%H:%M:%S" set datafile separator ";" set format x "%tH:%M:%S" #timedate set yrange[2.6:3.7] plot 'Entadung_4,2A_Temp_22,5C°.csv' u (t=timecolumn(1,myFmt), $0==0?t01=t:0, t-t01):2 every ::2::1061 lt 7 lc "blue" with lines ti "Entladung bei 3C", \ 'Entadung_2,8A_Temp_22,5C°.csv' u (t=timecolumn(1,myFmt), $0==0?t02=t:0, t-t02):2 every ::2::1604 lt 7 lc "web-green" with lines ti "Entladung bei 2C", \ 'Entadung_1,4A_Temp_22,0C°.csv' u (t=timecolumn(1,myFmt), $0==0?t03=t:0, t-t03):2 every ::2::3267 lt 7 lc "red" with lines ti "Entladung bei 1C",\ 'Entadung_0,7A_Temp_22,0C°.csv' u (t=timecolumn(1,myFmt), $0==0?t04=t:0, t-t04):2 every ::2::6696 lt 7 lc "yellow" with lines ti "Entladung bei 0,5C", \ 'Entadung_0,28A_Temp_22,0C°.csv' u (t=timecolumn(1,myFmt), $0==0?t05=t:0, t-t05):2 every ::2::16977 lt 7 lc "black" with lines ti "Entladung bei 0,2C", \ 'Entadung_0,14A_Temp_22,5C°.csv' u (t=timecolumn(1,myFmt), $0==0?t06=t:0, t-t06):2 every ::2::33731 lt 7 lc "violet" with lines ti "Entladung bei 0,1C"
解决方案
修改思路
针对黄色曲线对应的数据集,新增时间偏移逻辑:检测到时间回滚(当前时间小于上一行时间)时,自动累加24小时(86400秒)的偏移量,保证时间轴连续递增,避免出现负偏移。
修改后的代码
set grid set title 'Entladungen der Batterie über Zeit' set tics nomirror set title font ",12" set ylabel 'U/V' font ",12" set key box font ",12" set xtics time set xlabel 'time' font ",12" set border 11 set border lw 2 set xtics font ",8" set term wxt size 1200, 460 myFmt = "%H:%M:%S" set datafile separator ";" set format x "%tH:%M:%S" #timedate set yrange[2.6:3.7] # 定义变量用于记录上一行时间和累计偏移(仅针对黄色曲线) prev_t = 0 offset = 0 plot 'Entadung_4,2A_Temp_22,5C°.csv' u (t=timecolumn(1,myFmt), $0==0?t01=t:0, t-t01):2 every ::2::1061 lt 7 lc "blue" with lines ti "Entladung bei 3C", \ 'Entadung_2,8A_Temp_22,5C°.csv' u (t=timecolumn(1,myFmt), $0==0?t02=t:0, t-t02):2 every ::2::1604 lt 7 lc "web-green" with lines ti "Entladung bei 2C", \ 'Entadung_1,4A_Temp_22,0C°.csv' u (t=timecolumn(1,myFmt), $0==0?t03=t:0, t-t03):2 every ::2::3267 lt 7 lc "red" with lines ti "Entladung bei 1C",\ 'Entadung_0,7A_Temp_22,0C°.csv' u (t=timecolumn(1,myFmt), \ $0==0?(t04=t, prev_t=t, offset=0):0, \ t < prev_t ? offset=offset+86400 : 0, \ prev_t=t, \ t + offset - t04):2 every ::2::6696 lt 7 lc "yellow" with lines ti "Entladung bei 0,5C", \ 'Entadung_0,28A_Temp_22,0C°.csv' u (t=timecolumn(1,myFmt), $0==0?t05=t:0, t-t05):2 every ::2::16977 lt 7 lc "black" with lines ti "Entladung bei 0,2C", \ 'Entadung_0,14A_Temp_22,5C°.csv' u (t=timecolumn(1,myFmt), $0==0?t06=t:0, t-t06):2 every ::2::33731 lt 7 lc "violet" with lines ti "Entladung bei 0,1C"
代码说明
- 在plot前定义
prev_t和offset变量,用于跟踪黄色曲线的时间变化和累计偏移 - 黄色曲线的时间计算逻辑:
- 第一行数据初始化基准时间
t04、prev_t和偏移量offset - 若当前时间
t小于上一行时间prev_t(检测到时钟回滚),则给offset加86400秒 - 更新
prev_t为当前时间 - 最终使用
t + offset - t04作为X轴数值,保证时间轴连续递增
- 第一行数据初始化基准时间
内容的提问来源于stack exchange,提问作者Pascal
相关产品推荐
相关产品推荐

