2016-09-08 2 views
2

Ich bin ein Anfänger für Python, ich brauche eine Hilfe bei der Manipulation von CSV-Dateien in Python. Ich versuche, Sliding Window-Mechanismus für jede Zeile im Dataset zu tun.CSV-Dateien in Python (Gleitfenster)

für ein Beispiel, wenn der Datensatz dies

timestamp | temperature | windspeed 
965068200 9.61883 60.262 
965069100 9.47203 60.1664 
965070000 9.31125 60.0145 
965070900 9.13649 59.8064 

und wenn Benutzer angegebene Fenstergröße 3 ist, sollte das Ergebnis so etwas wie

timestamp | temperature-2 | temperature-1 |temperature-0 | windspeed-2 | windspeed-1 | windspeed-0 
965070000 9.61883 9.47203 9.31125 60.262 60.1664 60.0145 
965070900 9.47203 9.31125 9.13649 60.1664 60.0145 59.8064 

ich dies durch die Verwendung Liste des ObjectsArray tun könnte in Java.Lesen CSV und generieren neue CSV, die es transformierten Datensatz enthält. Hier ist der Code http://pastebin.com/cQnTBg8d #researh

Ich muss dies in Python tun, bitte helfen Sie mir, dies zu lösen.

Danke

+0

Haben Sie einen Blick auf die hatte [csv] (https://docs.python.org/3/library/csv.html) -Modul, noch? – janbrohl

+0

Dies sieht tatsächlich nicht wie tatsächliche CSV, so könnte es einfacher sein, nur String-Methoden zu verwenden. – janbrohl

+0

ist deine CSV groß? Kann es in Erinnerung gehalten werden? –

Antwort

0

Diese Antwort wird davon ausgegangen Sie verwenden Python 3.x - für Python 2.x einige Änderungen erforderlich sind (einige offensichtliche Orte kommentiert werden)

Für das Datenformat in die Frage, könnte dies ein Ausgangspunkt in Python sein:

import collections 

def slide(infile,outfile,window_size): 
    queue=collections.deque(maxlen=window_size) 
    line=infile.readline() 
    headers=[s.strip() for s in line.split("|")] 
    row=[headers[0]] 
    for h in headers[1:] 
     for i in reversed(range(window_size)): 
      row.append("%s-%i"%(h,i)) 
    outfile.write(" | ".join(row)) 
    outfile.write("\n") 
    for line in infile: 
     queue.append(line.split()) 
     if len(queue)==window_size: 
      row=[queue[-1][0]] 
      for j in range(1,len(headers)): 
       for old in queue: 
        row.append(old[j]) 
      outfile.write("\t".join(row)) 
      outfile.write("\n") 

ws=3 
with open("infile.csv","r") as inf: 
    with open("outfile.csv","w") as outf: 
     slide(inf,outf,ws) 

dieser Code tatsächlich dreht sich alles um eine Warteschlange mit den Eingabezeilen für das Fenster zu halten und nicht mehr - alles andere ist Text-zu-Liste-zu-Text.

Mit aktuellen CSV-Daten (siehe Kommentar)

import csv 
import collections 

def slide(infile,outfile,window_size): 
    r=csv.reader(infile) 
    w=csv.writer(outfile) 
    queue=collections.deque(maxlen=window_size) 
    headers=next(r) # r.next() on python 2 
    l=[headers[0]] 
    for h in headers[1:] 
     for i in reversed(range(window_size)): 
      l.append("%s-%i"%(h,i)) 
    w.writerow(l) 
    hrange=range(1,len(headers)) 
    for row in r: 
     queue.append(row) 
     if len(queue)==window_size: 
      l=[queue[-1][0]] 
      for j in hrange: 
       for old in queue: 
        l.append(old[j]) 
      w.writerow(l) 

ws=3 
with open("infile.csv","r") as inf: # rb and no newline param on python 2 
    with open("outfile.csv","w") as outf: # wb and no newline param on python 2 
     slide(inf,outf,ws) 
+0

Vielen Dank für Ihre Unterstützung @ Jankrohl, encounted Fehler in dieser Zeile, denke ich. headers = [strip() für s in infile.readline(). strip(). strip ("*"). split ("|")]. und bitte erwähnen Sie Frage ist jetzt bearbeitet. –

+0

entsprechend geändert – janbrohl

+0

Danke für deine Mühe @jankrohl, kann ich wegen einiger Fehler nicht kompilieren. Könntest du das bitte auch reparieren? https://i.imgsafe.org/14dea045e4.png –