2016-08-04 7 views
1

Ich bin auf der Suche nach einer Möglichkeit, diesen Prozess zu beschleunigen. Ich habe es funktioniert, aber es wird Tage dauern, um abzuschließen.
Ich habe eine Datendatei für jeden Tag eines Jahres. Und ich möchte sie in eine einzige HDF5-Datei mit einem Knoten für jedes Datenlabel (Daten-Tag) kombinieren.
Die Daten sieht wie folgt aus:Beschleunigen Sie die Umwandlung von CSV in HDF5 in Pandas

a,1468004920,986.078 
a,1468004921,986.078 
a,1468004922,987.078 
a,1468004923,986.178 
a,1468004924,984.078 
b,1468004920,986.078 
b,1468004924,986.078 
b,1468004928,987.078 
c,1468004924,98.608 
c,1468004928,97.078 
c,1468004932,98.078 

Hinweis, dass es eine unterschiedliche Anzahl von Einträgen und unterschiedlichen Aktualisierungsfrequenzen für jeden Daten Tag. Jede tatsächliche Datendatei hat ungefähr 4 Millionen Zeilen und ungefähr 4000 verschiedene Tag-Etiketten in jeder einzelnen Tag-Datei, und dann habe ich ein Jahr an Daten.
Der folgende Code macht was ich will. Das Ausführen für jede Datei dauert jedoch Tage. Ich suche nach Anregungen, dies zu beschleunigen:

import pandas as pd 
import datetime 
import pytz 
MI = pytz.timezone('US/Central') 

def readFile(file_name): 
    tmp_data=pd.read_csv(file_name,index_col=[1],names=['Tag','Timestamp','Value']) 
    tmp_data.index=pd.to_datetime(tmp_data.index,unit='s') 
    tmp_data.index.tz=MI 
    tmp_data['Tag']=tmp_data['Tag'].astype('category') 
    tag_names=tmp_data.Tag.unique() 
    for idx,name in enumerate(tag_names): 
     tmp_data.loc[tmp_data.Tag==name].Value.to_hdf('test.h5',name,complevel=9, complib='blosc',format='table',append=True) 

for name in ['test1.csv']: 
    readFile(name) 

Wesentlichen, was ich versuche, die CSV-Daten zu tun ist, „auszupacken“, so dass jeder Tag ist separat in der HDF5 Datei. Also, ich möchte alle Daten, die mit "a" markiert sind, für ein Jahr in ein einzelnes Blatt einer hdf5-Datei und alle "b" -Daten in das nächste Blatt usw. übertragen. Also muss ich den obigen Code auf jedem ausführen 365 Dateien. Ich habe es mit und ohne Komprimierung versucht und ich habe auch versucht Index = False. Aber beides schien keine große Wirkung zu haben.

Antwort

0

ich es auf diese Weise tun würde:

MI = pytz.timezone('US/Central') 

tmp_data=pd.read_csv('test1.txt',index_col=[1],names=['Tag','Timestamp','Value']) 
tmp_data.index=pd.to_datetime(tmp_data.index,unit='s') 
tmp_data.index.tz=MI 

hdf_key = 'my_key' 

store = pd.HDFStore('/path/to/file.h5') 

for loop which processes all your CSV files: 
    # pay attention at index=False - we want to index everything at the end 
    store.append(hdf_key, tmp_data, complevel=9, complib='blosc', append=True, index=False) 

# all CSV files have been processed, let's index everything... 
store.create_table_index(hdf_key, columns=['Tag','Value'], optlevel=9, kind='full') 
+0

Ich denke, dass das, was Sie vorschlagen, ist index = False zu verwenden. Was ich ohne viel Veränderung versucht habe. Aber Ihr Code entfernt den wichtigen Teil aus der Schleife. tmp_data ist meine CSV-Daten, und für jede Datei, in meinem tatsächlichen Code "test.txt" ist eigentlich eine Variable, wo ich den Dateinamen. Also setze ich jedes Tag in einen anderen Knoten. Ihr Code fügt die gesamte Datei in einen einzelnen Knoten ein. – Adam

+0

Um zu verdeutlichen, habe ich gerade meinen Code bearbeitet, um eine Funktion zu verwenden. Das Problem ist, wie ReadFile schneller wird. – Adam

Verwandte Themen