Как правильно построить специальный формат времени HMMSS?

С помощью сценариев BASH я проверяю связь с более чем 50 устройствами в компьютерной сети и отслеживаю, когда эти устройства выходят из строя. С помощью sed и некоторых других утилит, когда пинг не возвращается, он записывается в файл CSV и обрабатывается 3 раза в день.

Файл CSV имеет такой формат, как Входные данные (CSV).

 6    92121
 3    93237
 2    93828
 2    95409
 4    95439

 3   101045
 3   102515
 2   105211

где сначала мы видим количество сбоев, а затем время с удаленными отметками :. Это заставляет GNUPlot видеть «время» как целое число.

Когда приведенный выше диапазон отображен на графике, мы видим следующее (обрезано для фокуса):

Глядя на диаграмму, я думаю, что знаки + следует сместить немного вправо, поскольку они не совпадают с тем местом, где, по моему мнению, они должны быть. 4 незначительных тика от 80 000 будут 90 000, а еще два тика вправо будут 95 000. Моя следующая точка данных находится на отметке 95 409, которая, как я ожидаю, будет ближе к 100 000, чем кажется.

Возможно, это интеллектуальная игра, потому что я рисую время, основанное на 60 единицах, на графике, основанном на десяти единицах. Формат ЧЧ:ММ:СС. 100000 — это 10:00:00, и хотя существует 10:50:27 (105027 в GNUPlot), мы не увидим 10:75:13 (107513) из-за переноса времени на 60 минут. Интересно, можно ли сказать GNUPlot, что ось X ориентирована во времени таким образом...

Второй вопрос заключается в том, как явно указать GNUPlot помечать каждый такт X, уменьшая интерпретируемое предположение значений X.

Вот моя команда GNUPlot:

gnuplot <<-EOFMarker
set datafile separator ','
set title "Devices failing pings at given time - Graph Created:  UTC "
set xlabel 'Time in HH:MM:SS -- 6am run missing leading zero'
set ylabel 'Amount of Sites with Dropped Pings'
set yrange [1:75]
set grid
set key off
set xtics  rotate
set mxtics 8
set terminal png size 4000,700
set output '/BigPing/Reports/${reporttime}-${checkhour}-sites-time.png'
plot '/mnt/ram/graph-input.dat' using 2:1
EOFMarker

Первоначально у меня были линии, соединяющие точки +, чтобы улучшить читаемость, но график не возвращался к нулю, как я, хотя это происходило, когда у нас не было данных.

Я ожидал большего количества ярлыков xtick, чтобы пробелы не были такими большими.

Вообще-то я обязательно буду использовать gnuplot 4.6.2.

Добро пожаловать в StackOverflow! Пожалуйста, указывайте данные в виде текста, а не изображения. Вы упомянули, что время в вашем файле просто не содержит :, то есть ЧЧММСС. Это будет означать, что, например. 11:05:07 будет 110507, а не 1157, верно?

theozh 19.07.2024 19:37

Привет. Да, 110507 будет правильным: 11 часов 05 минут 07 секунд.

CyberdocWI 22.07.2024 16:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Конечно, gnuplot может отображать данные времени (проверьте help timecolumn и help time_specifiers), однако ваш формат данных времени немного неудачен. Например, gnuplot будет сложно решить, будет ли 123451h 23 m 45 s или 12 h 34 m 5 s. Следовательно, вы должны убедиться, что число состоит из 6 цифр, то есть с ведущим нулем. Вы можете принудительно сделать это через sprintf("%06d",...). Затем вы можете легко декодировать это время с помощью строки спецификатора "%H%M%S".

Скрипт: (работает для gnuplot>=5.0.0, январь 2015 г.)

### plot special time format
reset session

$Data <<EOD
 6    92121
 3    93237
 2    93828
 2    95409
 4    95439

 3   101045
 3   102515
 2   105211
EOD

t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))

set format x "%H:%M" timedate
set offset graph 0.05, 0.05, 0.05, 0.05
set grid x,y
set key noautotitle

plot $Data u (t(2)):1 w p pt 7 lc "red"
### end of script

Результат:

Дополнение: версия для gnuplot>=4.6.0, вывод такой же, как на графике выше.

Данные: SO78770582.dat

 6    92121
 3    93237
 2    93828
 2    95409
 4    95439

 3   101045
 3   102515
 2   105211

Скрипт: (работает как минимум для gnuplot>=4.6.0, март 2012 г.)

### plot special time format
reset

FILE = "SO78770582.dat"

t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))

set xdata time
set format x "%H:%M"
set offset graph 0.05, 0.05, 0.05, 0.05
set grid x,y
set key noautotitle

plot FILE u (t(2)):1 w p pt 7 lc rgb "red"
### end of script

Спасибо за предложение кода! Я изменил свой код и получаю строку 0: ';' ожидаемая строка 0: ошибка символа неправильного формата. Похоже, у меня какая-то синтаксическая ошибка, поскольку это напоминает мне о моих днях на C++. Я запускаю это внутри сценария BASH. Я проверю руководство GNUPLOT на наличие подсказок по синтаксису.

CyberdocWI 22.07.2024 16:42

Я также использую Gunplot 4.6 уровня патча 2.

CyberdocWI 22.07.2024 16:43

@CyberdocWI Ой! gnuplot 4.6.2 уже более 10 лет. Не можете обновиться на более новую версию? gnuplot теперь имеет версию 6.0.

theozh 22.07.2024 18:24

Сервер под управлением CentOS 7.9 находится в 1000 милях от меня и имеет строгие ограничения на подключение. Я собираюсь «экспортировать» файл .dat и попробовать его на чем-то гораздо более современном. Спасибо, что вернулись.

CyberdocWI 22.07.2024 19:02

@CyberdocWI вижу добавленную версию для gnuplot 4.6.0

theozh 22.07.2024 20:08

Спасибо за обновленный код! Он работает чисто, но графические данные не генерируются — размер png нулевого размера. Я собираюсь попытаться запустить сеанс XWindow, чтобы посмотреть, смогу ли я увидеть график без преобразования PNG. У меня есть другой сценарий GNUPLOT, который дает мне правильный график, поэтому я достаточно уверен, что базовая система находится в хорошей форме. Я проверил, что входной файл не пуст.

CyberdocWI 22.07.2024 22:29

Запускаю в X Windows - получаю кратенькое окошко с данными! Затем оно исчезает. Мне пришлось снять фильм с экрана, чтобы заморозить его, но да, данные есть. Мы определенно на правильном пути!

CyberdocWI 22.07.2024 22:41

Еще один извлеченный урок: важен порядок операторов между GNUPLOT и EOF. У меня был оператор графика перед оператором вывода, что привело к созданию пустого файла и экспорту двоичных символов на терминал.

CyberdocWI 22.07.2024 23:06

Отлично получилось с файлом .plt, инкапсулирующим данные в heredoc. Хороший трюк.

David C. Rankin 23.07.2024 02:57

@CyberdocWI, если ваш терминал записывает в файл, вам следует добавить set output в конце скрипта, чтобы фактически записать и закрыть файл.

theozh 23.07.2024 10:00

С огромной благодарностью @theozh мне удалось собрать подходящий код для моего случая. Я благодарен за подсказки. Я удалил некоторые материалы внутри цитат, чтобы избежать переноса.

gnuplot <<-EOFMarker
        set datafile separator ','
        set terminal png size 2000,500
        set title "Pings at given time - Graph Created:  UTC "
        set xlabel 'Time in HH:MM''
        set ylabel 'Amount of Sites with Dropped Pings'
        t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))
        set xdata time
        set format x "%H:%M"
        set offset graph 0, 0, 0, 0.05
        set grid x,y
        set key noautotitle
        set output '/BigPing/Reports/${v1}-${v2}-sites-time.png'
        plot '/mnt/ram/graph-input.dat' u (t(2)):1 w p pt 7 lc rgb "red"
EOFMarker

Другие вопросы по теме