gnuplot为什么警告:字符串中的时间格式错误

gnuplot为什么警告:字符串中的时间格式错误,gnuplot,Gnuplot,大家好,祝gnuplot的用户新年快乐,我的数据存储如下: France,FRA,Europe,67012883,cases,0,2020-01,,0,"Epidemic intelligence, national weekly data" France,FRA,Europe,67012883,cases,0,2020-02,0,0,"Epidemic intelligence, national weekly data" France,FRA,Euro

大家好,祝gnuplot的用户新年快乐,我的数据存储如下:

France,FRA,Europe,67012883,cases,0,2020-01,,0,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,0,2020-02,0,0,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,0,2020-03,0,0,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,3,2020-04,0.00447675113455423,3,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,3,2020-05,0.00895350226910846,6,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,5,2020-06,0.011938003025478,11,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,1,2020-07,0.00895350226910846,12,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,0,2020-08,0.00149225037818474,12,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,118,2020-09,0.1760855446258,130,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,996,2020-10,1.66236692129781,1126,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,4297,2020-11,7.89848125173185,5423,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,10595,2020-12,22.2225926319272,16018,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,24156,2020-13,51.857192892298,40174,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,30304,2020-14,81.2679555959412,70478,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,24925,2020-15,82.4154961367652,95403,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,17203,2020-16,62.8655239321669,112606,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,11969,2020-17,43.5319280324053,124575,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,6712,2020-18,27.8767293148692,131287,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,7776,2020-19,21.6197234791406,139063,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,3348,2020-20,16.5997932069271,142411,"Epidemic intelligence, national weekly data"
France,FRA,Europe,67012883,cases,2510,2020-21,8.74160271540623,144921,"Epidemic intelligence, national weekly data"
我的剧本:

reset
set terminal pngcairo size 800,600
set output 'test.png'
set datafile separator ","
set xdata time
set timefmt "%Y-%W"
#set format x "%s" timedate
set xtics format "%s" 
set grid

plot '<grep cases |grep France data1.csv' u 7:6 t 'Nbre cases France' w l lw 1
重置
设置端子pngcairo尺寸800600
设置输出“test.png”
设置数据文件分隔符“,”
设置扩展数据时间
设置时间表“%Y-%W”
#设置格式x“%s”时间日期
设置xtics格式“%s”
设置网格
我看到两个问题

  • 输入时忽略时间格式“%W”。请参阅内部文档
    帮助时间\u说明符
    。如果您想将其解释为“第N周第一天的第一秒钟”,那么您必须自己进行计算,因为gnuplot不会为您这样做

  • shell命令
    grep cases | grep France data1.csv
    格式错误。如果将其替换为
    grep France data1.csv
    ,程序将无误执行,但由于问题(1),它将无法生成您可能需要的绘图,因为本周已丢失

  • 以下是更正版本的起点:

    set datafile separator ","
    set xdata time
    timefmt = "%Y-%W"
    set xtics time format timefmt
    set grid
    
    SECPERWEEK = 3600.*24.*7.
    Y_W(col) = timecolumn(col,timefmt) + SECPERWEEK * (strcol(col)[6:7] - 1)
    
    plot 'data1.csv' u (Y_W(7)):6 t 'Nbre cases France' w l lw 1
    

    尽管OP已经对答案感到满意,但让我来评论一下周数。它不会改变绘图的形状,但在某些情况下,将周数映射到绝对日期可能是错误的

    不幸的是,从
    帮助时间\u说明符的gnuplot文档中,不清楚说明符是否对输出或输入有效,或者两者都有效。
    显然,
    %W
    仅用于输出

    请注意:周数有不同的定义(请参阅:)

  • 通常在美国:第一周是指一年中的第一个一月。星期天开始

  • 根据ISO 8601标准,通常在世界其他地区,第一周是一年中第一个星期四的一周,从星期一开始。或者换个说法:第一周是新年中天数最多的一周

  • 检查日历周数或周数,我注意到gnuplot的实现肯定有问题。简单的例子:

    代码:

    ### wrong calendar weeks or week numbers in gnuplot
    reset session
    
    StartDate = "24.12.2020"
    myTimeFmt = "%d.%m.%Y"
    SecondsPerDay = 3600*24
    do for [i=0:20] {
        myDate = strftime("%a, ".myTimeFmt, strptime(myTimeFmt,StartDate) + i*SecondsPerDay)
        myWeek = strftime("%W", strptime(myTimeFmt,StartDate) + i*SecondsPerDay)
        print sprintf("%s W:%s", myDate, myWeek)
    }
    ### end of code
    
    Thu, 24.12.2020 W52
    Fri, 25.12.2020 W52
    Sat, 26.12.2020 W52
    Sun, 27.12.2020 W52
    Mon, 28.12.2020 W53
    Tue, 29.12.2020 W53
    Wed, 30.12.2020 W53
    Thu, 31.12.2020 W53
    Fri, 01.01.2021 W01
    Sat, 02.01.2021 W01
    Sun, 03.01.2021 W00
    Mon, 04.01.2021 W01
    Tue, 05.01.2021 W01
    Wed, 06.01.2021 W01
    Thu, 07.01.2021 W01
    Fri, 08.01.2021 W01
    Sat, 09.01.2021 W01
    Sun, 10.01.2021 W01
    Mon, 11.01.2021 W02
    Tue, 12.01.2021 W02
    Wed, 13.01.2021 W02
    
    结果:

    ### wrong calendar weeks or week numbers in gnuplot
    reset session
    
    StartDate = "24.12.2020"
    myTimeFmt = "%d.%m.%Y"
    SecondsPerDay = 3600*24
    do for [i=0:20] {
        myDate = strftime("%a, ".myTimeFmt, strptime(myTimeFmt,StartDate) + i*SecondsPerDay)
        myWeek = strftime("%W", strptime(myTimeFmt,StartDate) + i*SecondsPerDay)
        print sprintf("%s W:%s", myDate, myWeek)
    }
    ### end of code
    
    Thu, 24.12.2020 W52
    Fri, 25.12.2020 W52
    Sat, 26.12.2020 W52
    Sun, 27.12.2020 W52
    Mon, 28.12.2020 W53
    Tue, 29.12.2020 W53
    Wed, 30.12.2020 W53
    Thu, 31.12.2020 W53
    Fri, 01.01.2021 W01
    Sat, 02.01.2021 W01
    Sun, 03.01.2021 W00
    Mon, 04.01.2021 W01
    Tue, 05.01.2021 W01
    Wed, 06.01.2021 W01
    Thu, 07.01.2021 W01
    Fri, 08.01.2021 W01
    Sat, 09.01.2021 W01
    Sun, 10.01.2021 W01
    Mon, 11.01.2021 W02
    Tue, 12.01.2021 W02
    Wed, 13.01.2021 W02
    

    因此,有
    W52
    W53
    W01
    W00
    (?),还有
    W01
    。。。这里肯定出了点问题。我将在有时间找到解决方法后立即更新此答案。

    根据gnuplot 5.2文档:

    %U一年中的一周(一周从周日开始)和

    %一年中的W周(星期一开始)

    但我还没有找到关于输入或输出的信息

    此处的代码与您的@theozh相同,但添加了%U:

    ### wrong calendar weeks or week numbers in gnuplot
    reset session
    
    StartDate = "24.12.2020"
    myTimeFmt = "%d.%m.%Y"
    SecondsPerDay = 3600*24
    do for [i=0:20] {
        myDate = strftime("%a, ".myTimeFmt, strptime(myTimeFmt,StartDate) + i*SecondsPerDay)
        myWeek = strftime("%W", strptime(myTimeFmt,StartDate) + i*SecondsPerDay)
        myWeekUS = strftime("%U", strptime(myTimeFmt,StartDate) + i*SecondsPerDay)
        print sprintf("%s W:%s U:%s", myDate, myWeek, myWeekUS)
    }
    ### end of code
    
    结果:

    Thu, 24.12.2020 W:52 U:52
    Fri, 25.12.2020 W:52 U:52
    Sat, 26.12.2020 W:52 U:52
    Sun, 27.12.2020 W:52 U:53
    Mon, 28.12.2020 W:53 U:53
    Tue, 29.12.2020 W:53 U:53
    Wed, 30.12.2020 W:53 U:53
    Thu, 31.12.2020 W:53 U:53
    Fri, 01.01.2021 W:01 U:01
    Sat, 02.01.2021 W:01 U:01
    Sun, 03.01.2021 W:00 U:01
    Mon, 04.01.2021 W:01 U:01
    Tue, 05.01.2021 W:01 U:01
    Wed, 06.01.2021 W:01 U:01
    Thu, 07.01.2021 W:01 U:01
    Fri, 08.01.2021 W:01 U:01
    Sat, 09.01.2021 W:01 U:01
    Sun, 10.01.2021 W:01 U:02
    Mon, 11.01.2021 W:02 U:02
    Tue, 12.01.2021 W:02 U:02
    Wed, 13.01.2021 W:02 U:02
    
    在这种情况下(%U)我们避免了U00,但仍然得到了U53(5天)和U01(9天)。

    解决方法请参见此处: