2012-02-27 4 views
2

все.gnuplot: данные участка от месяца назад до настоящего времени

У меня есть некоторые данные, которые периодически обновляются. Например:

1330347541 79 100 6 163 38 
1330349341 80 103 6 165 38 
1330351141 80 104 6 166 40 
1330352941 80 104 6 166 40 
1330354741 81 104 8 167 41 

Я хочу нарисовать эти данные на графике с помощью gnuplot.

Как я могу получить данные за месяц назад? Какой xrange мне нужно выбрать?

Редактировать: Мне нужно что-то вроде "набор xrange [ныне - 2592000, теперь]"

+0

Может быть [это] (http://stackoverflow.com/a/7833790/572616) ответ поможет ... – Woltan

+0

Нет. Это не полезно для меня. :( – lollo

ответ

1

Решение:

plot \ 
    "< awk -v date=`date +'%s'` '{ if ($1 > date - 2592000) print $0; }' datafile" using 1:2 … 
1

У меня была аналогичная проблема. Хотя вы точно не указали, как вы делали сюжет. Я хотел установить диапазон, используя временные метки, и нашел что-то неожиданное. , , так что, хотя, по-старому, я думаю, что стоит ответить на этот вопрос.

две полезные вещи:

  1. Вы можете построить с xrange установлен на [*.], А затем «показать xrange», чтобы выяснить, какие внутренние ПРЕДСТАВЛЕНИЯ из xrange используется вашим Gnuplot.

  2. Вы можете использовать() в gnuplot для ввода вычислений и вызовов функций.

Ответ # 1 Вы черчения с помощью timecolumn? До gnuplot 4,7 gnuplot внутренние времена были отслежены относительно 1 января 2000 года, а не эпохи unix 1-янв-1970. Ответ зависит от того, какую версию gnuplot вы используете? Вы можете использовать() в gnuplot для выполнения функций вызова или выполнения вычислений. Вы можете вызвать дату команды команды, чтобы получить метку времени. Так . , ,

set xrange [(system("date -d 'now' +%s")-2592000):(system("date -d 'now' +%s"))] 
show xrange 
    set xdata time 
    set xrange [ "1431007547" : "1431008547" ] noreverse nowriteback 

До GNUPLOT 4.7 Вы также должны вычесть 946684800 секунд из всех временных меток. В общем, я нашел около 1893370441 secs = ~ 60 лет - это значение, которое мне нужно вычесть с моей версией gnuplot (4.6). Найдите смещение временной отметки, выполнив график с данными временной метки без установки xrange, а затем выполните «show xrange» и вычислите смещение.

Таким образом определяют смещение используется множество xrange следующим образом:

#################################################################### 
## 1893456000 = 60 years seems to be the offset gnuoplot is using.## 
## or is it 1893370441 ? yeah it seems to be a bit short of 60 years. 
## I believe 946684800 should be the offset prior to 4.7.   ## 
#################################################################### 
TIMEOFFSET=946684800 
TIMEOFFSET=1893370441 
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)] 

Ответ # 2 Является ли ваш xrange фактически в строках файла данных? (т. е. не использовать временную шкалу). В этом случае установите xrange в терминах строк данных. Если ваши данные являются периодическими, вы можете рассчитать, сколько строк назад = определенный период времени.

я случайно использовать эту версию Gnuplot:

Version 4.6 patchlevel 1 last modified 2012-09-26 

Более подробную информацию и исследование ...

ли базовый график ваших данных:

set xdata time 
set timefmt "%s" 
set timefmt x "%s" 
set format x "%H:%M" 
plot "lollo.data" using 1:2, "lollo.data" using 1:3 

Хорошо, теперь установлен простой xrange от первого до последнего метки времени в данных.

set xrange [1330347541:1330351141] 
plot "lollo.data" using 1:2, "lollo.data" using 1:3 
              ^
    all points y value undefined! 

Woah !? В самом деле? Что не так с этим? Давайте сделаем «show xrange», чтобы узнать, что gnuplot считает, что диапазон.

show xrange 
    set xdata time 
    set xrange [ "1330347541" : "1330351141" ] noreverse nowriteback 

Это выглядит нормально. Установите xrange на *: * (с чего начинается gnuplot (вы также можете сделать «set xrange restore», но это устанавливает его на [-10: 10] - не то, что мы хотим)), сделайте сюжет и THEN show xrange.

set xrange [*:*] 
plot "lollo.data" using :2, "lollo.data" using :3 
show xrange 
    set xdata time 
    set xrange [ * : * ] noreverse nowriteback # (currently ["0":"4"]) 

Хммм. 0: 4 !! Интересно. Похоже, что xrange работает не во времени по строкам данных. Так. Это ваша проблема? Предполагая, что xrange будет работать в метках времени, а не в строках? Зная это, вы можете установить xrange в терминах строк. == Ответ # 2

Теперь. Давайте построим данные с использованием timecolumn.

set xrange [*:*] 
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3 
show xrange 
    set xdata time 
    set xrange [ * : * ] noreverse nowriteback # (currently ["-563022900":"-563014800"]) 

Whoooops! -563022900!? Отрицательная метка времени. Интересно. Итак, timestamp integer вычисляет странность/особенность в этой версии gnuplot?

Давайте попробуем установить простой xrange от первой до последней временной метки в данных и графике с использованием timecolumn.

set xrange [1330347541:1330351141] 
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3 
                     ^
    all points y value undefined! 

Это не нравится. Понятно, если он отключает отрицательные номера временных меток.

Давайте установить отрицательный диапазон МЕНЬШЕ один месяц секунд с помощью(), чтобы окружить расчет:

set xrange [(-563014800-2592000):-563014800] 
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3 

Это работает. Для меня. gnuplot 4.6. Но откуда взялся -563014800 !?

$ date -d @1330347541 
Mon 27 Feb 12:59:01 GMT 2012 
$ dc -e '1330347541 16o p' 
4F4B7E15 
### ??? I didn't find any hex relation - looking for evidence of integer calc overflow/sign calc errors 

# What offset 
$ dc -e '0 1330347541 - 563022900 - p' 
-1893370441 
# taking a timestamp from today (7 march 2015) and doing a plot I saw gnuplot used xrange with -462448800 . . . 
$ dc -e '0 1431000097 - 462448800 - p' 
-1893448897 

HAH! Это примерно то же самое. -1893448897 = ~ -1893370441 Это примерно 60 лет. ТАК. Используется 60-летнее смещение. В моей версии gnuplot. ИНТЕРЕСНО. и YEESH. Мне кажется, мне нужно вычесть около 1893456000 секунд для преобразования во внутреннюю метку времени gnuplot. На самом деле 1893370441 кажется ближе к тому, что нужно.

В другом месте в Интернете эпоха gnuplot, как говорят, находится в 2000 году. Это должно означать смещение 946684800. Но сейчас это не похоже на меня.

YMMV. Я полагаю.

С помощью этого смещения можно установить xrange от одного месяца назад Теперь, как это: == Ответ # 1

TIMEOFFSET=1893370441 
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)] 

А как/почему это происходит в Gnuplot?

. От: http://gnuplot.10905.n7.nabble.com/30-year-time-offset-reading-nonuniform-matrix-s-input-td17231.html «К сожалению, я думаю, что это было, вероятно, меня я не использовал UNIX тогда, так 2000, казалось произвольным, как 1970.

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

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

Dave D»

Смежные вопросы