Здравствуйте и с новым годом, пользователи gnuplot, у меня хранилище данных выглядит следующим образом :

France,FRA,Europe,67012883,cases,0,2020-01,,0,"Epidemic intelligence, national weekly data"
Франция,FRA,Европа,67012883,случаи,0,2020-02,0,0,"Эпидемическая разведка, национальные еженедельные данные"
Франция,FRA,Европа,67012883,случаи,0,2020-03,0,0,"Эпидемическая разведка, национальные еженедельные данные"
Франция,FRA,Европа,67012883,случаи,3,2020-04,0.00447675113455423,3,"Эпидемическая разведка, национальные еженедельные данные"
Франция,FRA,Европа,67012883,случаи,3,2020-05,0.00895350226910846,6,"Эпидемическая разведка, национальные еженедельные данные"
Франция,FRA,Европа,67012883,случаи,5,2020-06,0.011938003025478,11,"Эпидемическая разведка, национальные еженедельные данные"
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"
Франция,FRA,Европа,67012883,случаи,118,2020-09,0.1760855446258,130,"Эпидемическая разведка, национальные еженедельные данные"
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 ","
установить время xdata
set timefmt "%Y-%W"
#set format x "%s" timedate
установить формат xtics "%s"
установить сетку

plot '

ошибка :

France,FRA,Europe,67012883,deaths,2638,2020-51,80.4919853992851,60549,"Epidem...

Почему у меня такое сообщение об ошибке? и я застрял, мои данные не строятся.

Suntory

Ответов: 3

Ответы (3)

Я вижу две проблемы.

  1. Временной формат '%W' игнорируется при вводе. См. внутреннюю документацию help time_specifiers. Если вы хотите интерпретировать его как что-то вроде "первая секунда первого дня недели N", вам придется вычислять это самостоятельно, поскольку gnuplot не делает этого за вас.

  2. Команда оболочки grep cases |grep France data1.csv имеет неправильную форму. Если вы замените ее на grep France data1.csv, программа выполнится без ошибок, но из-за проблемы (1) она не выдаст график, который вы, вероятно, хотите получить, поскольку потерян номер недели.

Здесь приведена отправная точка для исправленной версии:

set datafile separator ","
установить время xdata
timefmt = "%Y-%W"
установить формат времени xtics time timefmt
установить сетку

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

введите описание изображения здесь

Хотя ОП уже удовлетворен ответом, позвольте мне сделать замечание по поводу номеров недель. Это не изменит форму графика, но в некоторых случаях отображение номеров недель на абсолютные даты может быть неверным.

Из документации gnuplot help time_specifiers, к сожалению, неясно, действительны ли спецификаторы для вывода или ввода или для обоих. Очевидно, что %W предназначен только для вывода.

Обратите внимание: существуют различные определения номеров недель (см.: https://en.wikipedia.org/wiki/ISO_week_date)

.
  1. Обычно в США: неделя 1 - это неделя, которая содержит 1 января года. Недели начинаются по воскресеньям.

  2. типично в "остальном" мире, согласно ISO 8601: неделя 1 - это неделя, которая содержит первый четверг года, недели начинаются по понедельникам. Или по-другому: неделя 1 - это неделя с большим количеством дней в новом году.

Проверяя календарные недели или номера недель, я заметил, что в реализации gnuplot что-то не так. Простой пример:

Код:

## неверные календарные недели или номера недель в gnuplot
сброс сессии

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)
}
### конец кода

Результат:

 Thu, 24.12.2020 W52
Fri, 25.12.2020 W52
Сб, 26.12.2020 W52
Солнце, 27.12.2020 W52
Пн, 28.12.2020 W53
Вторник, 29.12.2020 W53
Ср, 30.12.2020 W53
Thu, 31.12.2020 W53
Пн, 01.01.2021 W01
Сб, 02.01.2021 W01
Солнце, 03.01.2021 W00
Пн, 04.01.2021 W01
Вторник, 05.01.2021 W01
Ср, 06.01.2021 W01
Thu, 07.01.2021 W01
Пн, 08.01.2021 W01
Сб, 09.01.2021 W01
Солнце, 10.01.2021 W01
Пн, 11.01.2021 W02
Вторник, 12.01.2021 W02
Ср, 13.01.2021 W02

Так, есть W52, W53, W01, W00(???) и снова W01... что-то здесь определенно не так. Я обновлю этот ответ, как только у меня будет время найти обходной путь.

Согласно документации gnuplot 5.2 :

%U неделя года (неделя начинается в воскресенье) и

%W неделя года (неделя начинается в понедельник)

Но я не нашел информации о вводе или выводе.

Здесь тот же код, что и у вас @theozh, но с добавлением %U :

## неправильные календарные недели или номера недель в gnuplot
сброс сессии

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)
}
### конец кода

Результат:

 Thu, 24.12.2020 W:52 U:52
Fri, 25.12.2020 W:52 U:52
Сб, 26.12.2020 Вт:52 U:52
Sun, 27.12.2020 W:52 U:53
Пн, 28.12.2020 Вт:53 U:53
Вторник, 29.12.2020 Вт:53 U:53
Ср, 30.12.2020 Вт:53 U:53
Thu, 31.12.2020 W:53 U:53
Fri, 01.01.2021 W:01 U:01
Сб, 02.01.2021 Вт:01 U:01
Sun, 03.01.2021 W:00 U:01
Пн, 04.01.2021 Вт:01 U:01
Вт, 05.01.2021 Вт:01 U:01
Ср, 06.01.2021 Вт:01 U:01
Thu, 07.01.2021 W:01 U:01
Fri, 08.01.2021 W:01 U:01
Сб, 09.01.2021 Вт:01 U:01
Солнце, 10.01.2021 Вт:01 U:02
Пн, 11.01.2021 Вт:02 U:02
Вторник, 12.01.2021 Вт:02 U:02
Ср, 13.01.2021 Вт:02 U:02

В этом случае (%U) мы избегаем U00, но все равно получаем U53 (5 дней) и U01 (9 дней).

2022 WebDevInsider