2016-07-05 3 views
0

Ich bin neu in der Python und Scripting im Allgemeinen, so würde ich wirklich eine Anleitung beim Schreiben eines Python-Skripts schätzen. Also, auf den Punkt:Wie bekomme ich nur die Zeilen mit dem höchsten Wert, wenn sie sich in einem Zeitfenster befinden?

Ich habe eine große Anzahl von Dateien in einem Verzeichnis. Einige Dateien sind leer, andere enthalten Zeilen wie folgt aus:

16 2009-09-30T20: 07: 59.659Z 0,05 0,27 13,559 6
16 2009-09-30T20: 08: 49.409Z 0,22 0,312 15,691 7
16 2009-09-30T20: 12: 17.409Z -0.09 0.235 11.826 4
16 2009-09-30T20: 12: 51.159Z 0.15 0.249 12.513 6
16 2009-09-30T20: 15: 57.209Z 0.16 0.234 11.776 4
16 2009-09-30T20: 21: 17.109Z 0,38 0,303 15,201 6
16 2009-09-30T20: 23: 47.959Z 0,07 0,259 13,008 5
16 2009-09-30T20: 32: 10.109Z 0.0 0.283 14.195 5
16 2009-09-30T20: 32: 10.309Z 0,0 0,239 12,009 5
16 2009-09-30T20: 37: 48.609Z -0,02 0,256 12,861 4
16 2009-09-30T20: 44: 19.359Z 0,14 0,251 12,597 4
16 2009-09-30T20: 48: 39.759Z 0,03 0,284 14,244 5
16 2009-09-30T20: 49: 36.159Z -0,07 0,278 13,98 4
16 2009-09-30T20: 57: 54.609Z 0,01 0,304 15,294 4
16 2009-09-30T20: 59: 47.759Z 0,27 0,265 13,333 4
16 2009-09-30T21: 02: 56.209Z 0,28 0,272 13,645 6

und so weiter.

Ich möchte diese Zeilen aus den Dateien in eine neue Datei bekommen. Aber es gibt einige Bedingungen! Wenn sich zwei oder mehr aufeinanderfolgende Zeilen innerhalb eines Zeitfensters von 6 Sekunden befinden, sollte nur die Zeile mit dem höchsten Schwellenwert in die neue Datei gedruckt werden.

So etwas wie die:

Original:
16 2009-09-30T20: 32: 10.109Z 0,0 0,283 14,195 5
16 2009-09-30T20: 32: 10.309Z 0,0 0,239 12,009 5

in der Ausgabedatei:
16 2009-09-30T20: 32: 10.109Z 0,0 0,283 14,195 5

Denken Sie daran, dass die Linien aus verschiedenen Dateien Zeiten innerhalb 6s Fenster mit Linien aus anderen Dateien haben können, also die Linie, das wird in o sein Ausgabe ist diejenige, die den höchsten Schwellenwert von verschiedenen Dateien hat.

Der Code, der erklärt, was ist hier, was in den Zeilen ist:

import glob 
from datetime import datetime 

path = './*.cat' 
files=glob.glob(path) 
for file in files: 

    in_file=open(file, 'r') 
    out_file = open("times_final", "w") 

    for line in in_file.readlines(): 
     split_line = line.strip().split(' ') 
     template_number = split_line[0] 
     t = datetime.strptime(split_line[1], '%Y-%m-%dT%H:%M:%S.%fZ') 
     mag = split_line[2] 
     num = split_line[3] 
     threshold = float(split_line[4]) 
     no_detections = split_line[5] 

in_file.close() 
out_file.close() 

Vielen Dank für Hinweise, Richtlinien, ...

+0

was haben Sie versucht, unerwünschte Datensätze zu verwerfen? und sind die Datensätze zwischen Dateien überlappend oder streng nicht überlappend (1 Datei endet, 2. Datei wird nur mit höheren Daten fortgesetzt)? – Aprillion

+0

Ich interessiere mich nicht für die unerwünschten Aufzeichnungen. Dateien überlappen – lmorgh

+0

gut ... es ist einfach, nur eine Datei aus all diesen Dateien zu erstellen und damit zu arbeiten. das sollte den Code vereinfachen. Also, sagen wir, ich habe nur eine Datei, die zeitlich sortiert ist? – lmorgh

Antwort

0

sagte Sie in den Kommentaren Sie wissen, wie zu fusionieren Mehrere Dateien in 1 sortiert nach t und die 6 Sekunden Fenster beginnen mit der ersten Zeile und basieren auf tatsächlichen Daten.

So müssen Sie sich den maximalen Schwellenwert pro Fenster merken und erst dann schreiben, wenn Sie sicher sind, dass Sie alle Zeilen in einem Fenster bearbeitet haben.Beispielimplementierung:

from datetime import datetime, timedelta 
from csv import DictReader, DictWriter 

fieldnames=("template_number", "t", "mag","num", "threshold", "no_detections") 
with open('master_data') as f_in, open("times_final", "w") as f_out: 
    reader = DictReader(f_in, delimiter=" ", fieldnames=fieldnames) 
    writer = DictWriter(f_out, delimiter=" ", fieldnames=fieldnames, 
         lineterminator="\n") 
    window_start = datetime(1900, 1, 1) 
    window_timedelta = timedelta(seconds=6) 
    window_max = 0 
    window_row = None 
    for row in reader: 
     try: 
      t = datetime.strptime(row["t"], "%Y-%m-%dT%H:%M:%S.%fZ") 
      threshold = float(row["threshold"]) 
     except ValueError: 
      # replace by actual error handling 
      print("Problem with: {}".format(row))  
     # switch to new window after 6 seconds 
     if t - window_start > window_timedelta: 
      # write out previous window before switching 
      if window_row: 
       writer.writerow(window_row) 
      window_start = t 
      window_max = threshold 
      window_row = row 
     # remember max threshold inside a single window 
     elif threshold > window_max: 
      window_max = threshold 
      window_row = row 
    # don't forget the last window 
    if window_row: 
     writer.writerow(window_row) 
+0

Danke, es funktioniert wie geplant (getestet auf vorgefertigten Daten, ich wusste, wie es aussehen sollte). – lmorgh

Verwandte Themen