2016-04-21 4 views
1

Ich habe folgende Daten in einer Datei. Ich möchte die time und die size aus relevanten Linien extrahieren und ein Zeitreihendiagramm zeichnen.Trickreiche Listenmanipulation in einem Wörterbuch

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 JK31 (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 L9 <Kx JK31 (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 

Ich habe das folgende Programm, um es zu tun.

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 

Ich bin mit zwei Wörterbücher oben, time_data und size_data. Jedes der Daten enthält die Elemente match_list als Schlüssel. Die values sind eine Liste, die Datetime-Objekte enthält.

Das obige wurde getan, so dass es einfach sein würde, mit Matplotlib zu plotten. Jetzt möchte ich Folgendes tun.

Wie Sie in den obigen Beispieldaten für den gleichen Schlüssel L8 <Mx JK31 (Mx) sehen können, haben Sie zwei Werte, die die gleiche Zeit haben (04:23:26).

Ich möchte die Datenstruktur (d. H. Die Liste in meinen Wörterbüchern) so ändern, dass die Größenwerte (d. H. Werte in der Liste im Wörterbuch size_data) jede Minute aufsummiert werden.

Angenommen, es gibt 5 Werte, wie unten

04:23:26 56 04:23:26 60 04:23:43 70 04:23:46 80 04:23:56 90

Ich möchte das obige mit 04:23:00 und 356 ersetzen. Wie gehe ich dabei vor?

+0

Enthält die Datei zufällig nur durch Tabulatoren getrennte Werte? Wenn ja, verwenden Sie das 'csv' Modul. –

+0

@ReutSharabani - Ich glaube nicht. Es scheint Räume zu enthalten. – liv2hak

+0

Leerzeichen gibt es innerhalb Werte, aber was trennt ** Werte **? –

Antwort

1

Ich glaube, Ihre Frage ist ein bisschen einfacher als es zunächst scheint, weil der zusätzliche Aufwand für das Parsen der Datei. Ich nehme an, dass das Parsing funktioniert, und Sie am Ende mit einer Liste Tupel, dicts ... Jetzt möchten Sie eine Art Aggregation auf dieser Liste durchführen, oder?

so, ausgehend von

[ 
['10:10:01', 45], 
['10:10:11', 135], 
['10:10:50', 21], 
['10:10:57', 4], 
['10:11:01', 2], 
['10:11:11', 8] 
] 

Sie

[ 
['10:10:00', 205], 
['10:11:00' 10] 
] 

erhalten möchten, wenn ja, Sie leicht eine defaultdict und datetime.replace (Sekunden = 0) für das nutzen könnten.

Dieser Code wird sein nicht Plug-and-Play, aber man sollte es passen in die Situation ganz leicht

input = # your parser function 
output = defaultdict(int) 

for date, value in input.items(): 
    output[date.replace(seconds=0)] += value 
der Lage sein,

Wenn Sie eine Liste wieder möchten Sie output.items()

gut nutzen konnten Glück!

+0

Meine Liste ist nicht so. Ich meine, ich habe zwei getrennte Listen in zwei Wörterbüchern. Sie sind durch einen gemeinsamen 'Schlüssel' verbunden – liv2hak

Verwandte Themen