2016-04-19 11 views
1

Ich habe eine Funktion geschrieben, die CSV-Dateien liest, speichert sie als Datenframe und resample sie auf Stundenbasis. Unten ist mein Code;Speichern von CSV-Datei Inhalt in Daten Frames [Python Pandas]

def ABC(path1,path2): 
    df1=pd.read_csv(path1, sep='\t',names = ["Datetime", "Value"]) 
    df2=pd.read_csv(path2, sep='\t',names = ["Datetime", "Value"]) 
    df1['Datetime']=pd.to_datetime(df1['Datetime']) 
    df1=df1.set_index('Datetime') 
    df1=df1.resample('H',how='sum') 
    df2['Datetime']=pd.to_datetime(df2['Datetime']) 
    df2=df2.set_index('Datetime') 
    df2=df2.resample('H',how='sum') 
    ABC = pd.DataFrame(df1['Value'] + df2['Value']) 
    ABCD = ABC * 0.519 
    return ABC, ABCD 
ABC, ABCD= ABC('C:\Users\Desktop\B1.tsv' 
          ,'C:\Users\Desktop\B2.tsv') 

Dieses Programm funktioniert gut, aber was ist, wenn ich 30 Dateipfade haben, dann wird es schwierig sein, 30 Datenrahmen zu machen und diesen Prozess tun. Ich dachte darüber nach, den obigen Weg zu gehen;

Der obige Code gibt nur einen Datenrahmen aus und gibt nicht aus, was das erste Skript macht. Irgendeine Idee, was ich falsch mache?

+0

Also 'df1, df2, df3 = ABC()' gibt nicht drei Datenrahmen zurück? – IanS

+0

nein, es sagt 'braucht mehr als 1 Wert zum Auspacken'. Auch das Schreiben von 'ABC()' anstelle von 'df = ABC()' gibt mir einen Datenrahmen. – Muhammad

Antwort

1

Sie kehren zu früh zurück (nach der ersten Iteration). Es ist ein Einrückungsproblem. Die Funktion sollte lesen:

def ABC(): 
    Path= ['B1','B2','B3'] 
    general = pd.DataFrame() 
    for i in Path: 
     url = ('C:\Users\Desktop\%s.tsv'%i) 
     X = pd.read_csv(url,sep='\t',names = ["Datetime", "Value"]) 
     X['Datetime']=pd.to_datetime(X['Datetime']) 
     X=X.set_index('Datetime') 
     X=X.resample('H',how='sum') 
     if len(general) == 0: 
      general = X 
     else: 
      general = general['Values'] + X['Values'] 
    return general 

Beachten Sie die Einrückung der letzten Zeile.


EDIT: Code hinzugefügt, um den Datenrahmen innerhalb der Schleife zu summieren, wie in einem Kommentar angefordert.

Erstellen Sie zunächst einen leeren Datenrahmen mit der Bezeichnung general. Bei der ersten Iteration (wenn die Länge des leeren Datenrahmens 0 ist), weisen Sie den aktuellen Datenrahmen X der general zu. Fügen Sie bei nachfolgenden Iterationen die Werte des aktuellen Datenrahmens zur Summe aller Werte der vorherigen Datenrahmen hinzu, die in general gespeichert sind.

+0

Ops, Danke @IanS. Wie würde ich tun, wenn ich diese Daten in der Funktion hinzufügen müsste, z. B. ABC = pd.DataFrame (df1 ['Wert'] + df2 ['Wert']) '. Gibt es eine Möglichkeit, dies innerhalb der for-Schleife zu tun und die Rückkehr sollte ein Datenrahmen anstelle von drei sein? – Muhammad

+0

Danke, könntest du bitte erklären, was diese neuen (letzten) Zeilen machen? – Muhammad

Verwandte Themen