绘制多个基于时间的开/关

时间:2018-03-01 19:37:28

标签: gnuplot

我有一大堆数据库连接正在使用一段时间,然后在再次被调用之前休息。

我希望随着时间的推移绘制它们的用法,所以我为每个连接成像一行,随着时间的推移打开和关闭。

基本上可以格式化数据但是需要,但作为一个例子,它可能看起来像这样

2018-03-01 20:31:00,000Z foo start
2018-03-01 20:31:00,100Z bar start
2018-03-01 20:31:00,300Z bar stop
2018-03-01 20:31:00,400Z foo stop
2018-03-01 20:31:00,600Z bar start
2018-03-01 20:31:00,900Z bar stop

情节看起来像这样

foo ****
bar  **   ***
    0123456789

其中bootom上的数字表示100毫秒

1 个答案:

答案 0 :(得分:1)

我认为这超出了“纯粹”Gnuplot所能提供的范围。但是,有人可能会对数据文件进行预处理,以使其更容易被Gnuplot消化。例如,下面的示例脚本传递数据,以100毫秒为单位表示日期/时间,并为相应时间foo的每个事件(bar / t)标记。在t时,所述事件的实例数是多少。加载整个文件后,它会处理此数据并为每个事件打印事件至少运行一个实例的所有时间间隔。这具有以下优点:它还支持相同类型的重叠事件(即,同时连接)。

#!/usr/bin/env python
import datetime
import sys

t_min = sys.maxsize
t_max = -t_min
events = {}
with open(sys.argv[1], 'r') as F:
    for line in F:
        date, time, event, etype = map(lambda s: s.strip(), line.strip().split())
        if not etype in ['start', 'stop']: continue

        t = datetime.datetime.strptime('{date:s} {time:s}'.format(date = date, time = time), '%Y-%m-%d %H:%M:%S,%fZ').timestamp()
        t = int(t*10)
        t_min = min(t_min, t)
        t_max = max(t_max, t)

        if not event in events: events[event] = {}
        if not t in events[event]: events[event][t] = 0
        events[event][t] += (1 if etype == 'start' else -1)

unique_events = sorted(events.keys())
for eid, event in enumerate(unique_events):
    print('#%d\t%s' % (eid, event))

    ts = sorted(events[event].keys())

    multiplicity, t_prev = 0, 0
    for t_curr in ts:
        f = events[event][t_curr]
        t_curr -= t_min

        if multiplicity > 0:
            print('{t_prev:d}\t{eid:d}\t{multiplicity:d}\n{t_curr:d}\t{eid:d}\t{multiplicity:d}\n'.format(t_prev = t_prev, t_curr = t_curr, eid = eid, multiplicity = multiplicity))

        multiplicity = max(multiplicity + f, 0)
        t_prev = t_curr

样本数据:

2018-03-01 20:31:00,000Z foo start
2018-03-01 20:31:00,000Z foo start
2018-03-01 20:31:00,100Z bar start
2018-03-01 20:31:00,300Z bar stop
2018-03-01 20:31:00,400Z foo stop
2018-03-01 20:31:00,600Z bar start
2018-03-01 20:31:00,900Z bar stop
2018-03-01 20:31:00,900Z foo stop

这会产生:

#0  bar
1   0   1
3   0   1

6   0   1
9   0   1

#1  foo
0   1   2
4   1   2

4   1   1
9   1   1

这意味着例如事件1foo)在间隔[0, 4]上运行了2个实例,而[4, 9]上只有1个实例。然后,此输出可由Gnuplot直接处理。