简体   繁体   English

matplotlib - 使用 matplotlib 绘制时间序列

[英]matplotlib - plotting a timeseries using matplotlib

  03/12 20:23:26.11: 04:23:26 L9 <Mx  Acc  Magnum All            XDV:00111A0000000117 00D3001200870172 01FF6000F01CFE81 3D26000000000300
    03/12 20:23:26.11: 04:23:26 L9 <Mx  Acc  MID 0x1500 Len 26   XDV:00111A0000000117 00D3001200870172 01FF6000F01CFE81 3D26000000000300
    03/12 20:23:26.11: 04:23:26 L8 <Mx  JK31 (Mx)                  JSP:17.37.6.99: Size = 166, Data: 00345C4101003031 E463EF0113108701 5A01FF6008F01CFE 81AB170000000003 EF01131087015A01 FF6008F01CFE81AB 170000000003EF01 131087015B01FF60 00F01CFE81701B00 00000003EF011310 87015B01FF6000F0 1CFE81701B000000 0003EF0113108701 5C01FF2000F01CFE 81CB240000000003 EF01131087015C01 57CC00F01CFE81CB 240000000003EF01 131087015D01FF20 00F01CFE815B2900 00000003EF011310 87015D01FF2000F0 1CFE815B29000000 0003EF0113108701 5E01FF6000F01CFE 819D280000000003 EF01131087015E01 FF6000F01CFE819D 0003
    03/15 20:23:26.11: 04:23:26 L8 <Kx  JK49 (Kx)                  JSP:15.33.2.93: Size = 163, Data: 00647741000030EF 01131087015A01FF 6008F01CFE81AB17 0000000003EF0113 1087015A01FF6008 F01CFE81AB170000 000003EF01131087 015B01FF6000F01C FE81701B00000000 03EF01131087015B 01FF6000F01CFE81 701B0000000003EF 01131087015C01FF 2000F01CFE81CB24 0000000003EF0113 1087015C01FF2000 F01CFE81CB240000 000003EF01131087 015D01FF2000F01C FE815B2900000000 03EF01131087015D 01FF2000F01CFE81 5B290000000003EF 01131087015E01FF 6000F01CFE819D28 0000000003EF0113 1087015E01FF6000 F01CFE819D280000 A6220000000003
    03/15 20:23:26.11: 04:23:26 L8 <Kx  JK21 (Kx)                  JSP:10.22.1.53:Size = 163, Data: 009D1141000030EF 01131087015A01FF 6008F01CFE81AB17 0000000003EF0113 1087015A01FF6008 F01CFE81AB170000 000003EF01131087 015B01FF6000F01C FE81701B00000000 03EF01131087015B 01FF6000F01CFE81 701B0000000003EF 01131087015C01FF 2000F01CFE81CB24 0000000003EF0113 1087015C01FF2000 F01CFE81CB240000 000003EF01131087 015D01FF2000F01C FE815B2900000000 03EF01131087015D 01FF2000F01CFE81 5B290000000003EF 01131087015E01FF 6000F01CFE819D28 0000000003EF0113 1087015E01FF6000 F01CFE819D280000 A6220000000003

I have the following data extracted from the data above.我从上面的数据中提取了以下数据。 which contains time and a number.I want to plot the data as a timeseries using matplotlib.其中包含时间和数字。我想使用 matplotlib 将数据绘制为时间序列。

04:20:54 491
04:21:02 33
04:21:04 1063
04:21:04 1063
04:21:04 711
04:21:09 56
04:21:12 73
04:21:14 1066
04:21:14 931
04:21:18 618
04:21:18 51
04:21:22 27
04:21:24 1063
04:21:24 1063
04:21:24 535
04:21:33 24
04:21:33 1063
04:21:33 1063
04:21:33 978
04:21:43 36
04:21:45 1063
04:21:45 1063
04:21:45 755
04:21:53 27
04:21:55 1066
04:21:55 1063
04:21:55 711
04:22:03 30
04:22:05 1069
04:22:05 1063
04:22:05 1063
04:22:05 450
04:22:10 56
04:22:12 76
04:22:15 1066
04:22:15 1063
04:22:15 1066

I was the following code.我是下面的代码。

import matplotlib.pyplot as plt

match = ("L8 <Mx JK31 (Mx)")
with open("test.txt") as fin:
print(' : {}', fin.name)
for line in fin:
    if match in line:
        line = line.strip.split()
        time = line[2]
        size = line[9].strip(",")
        plt.plot(time, data_size)

I am getting the following error.我收到以下错误。

04:00:07 27
Traceback (most recent call last):
  File "sawe_issue.py", line 16, in <module>
    plt.plot(time, data_size)
  File "C:\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 3099, in plot
    ret = ax.plot(*args, **kwargs)
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py", line 1373, in plot
    for line in self._get_lines(*args, **kwargs):
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 304, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 263, in _plot_args
    linestyle, marker, color = _process_plot_format(tup[-1])
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 115, in _process_plot_format
    'Unrecognized character %c in format string' % c)
ValueError: Unrecognized character 7 in format string

You can use the parser package from dateutil .您可以使用dateutilparser包。 It handles a lot of common formats without having to specify format strings.它可以处理许多常见的格式,而无需指定格式字符串。

from dateutil import parser

import matplotlib.pyplot as plt

match = ("L8 <Mx JK31 (Mx)")
with open("test.txt") as fin:
    print(' : {}', fin.name)
    time_data = []
    size_data = []
    for line in fin:

        if match in line:
           line = line.strip.split()
           time_str = line[2]
           t = parser.parse(time_str)  ## NOTE: changed 'time' to 't', because it's a bad idea to use 'time' as a variable name, since it is a python built-in
           time_data.append(t)
           size = int(line[9].strip(","))
           size_data.append(size)
    plt.plot(time_data, size_data)   

Also note: parser.parse() returns a datetime object that includes a year/month/day value.另请注意: parser.parse() 返回一个包含年/月/日值的日期时间对象。 If none is specified (as in your example), the year/month/day will be set to the current day.如果没有指定(如在您的示例中),则年/月/日将设置为当天。

UPDATE: Here's a way to generalize for multiple match strings:更新:这是一种概括多个匹配字符串的方法:

from dateutil import parser

import matplotlib.pyplot as plt

match_list = ["L8 <Mx JK31 (Mx)", "L9 <Mx JK31 (Mx)"]  ## put all match strings in this list
with open("test.txt") as fin:
    print(' : {}', fin.name)
    time_data = {}  ## save data in dictionaries, with string keys and lists as values
    size_data = {}
    for line in fin:
        for match in match_list:
            if match in line:
               if match not in time_data:
                   time_data[match] = []  ## initialize empty list the first time this key is encountered
                   size_data[match] = []
               line = line.strip.split()
               time_str = line[2]
               t = parser.parse(time_str)  
               time_data[match].append(t)
               size = int(line[9].strip(","))
               size_data[match].append(size)
    for match in match_list:
        plt.figure()  ## create a new figure for each data set
        plt.plot(time_data[match], size_data[match])
    plot.show()  ## simultaneously show all plots

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM