2016-04-13 4 views
1

Hallo Ich habe eine tägliche Daten in einer Datei und die täglichen Daten sind in monatlichen Spalten angeordnet. mit einigen Dateiinformationen am Anfang. Und die Daten wie folgt aussehen:Wie Daten aus TXT-Datei mit Leerzeichen Trennzeichen gelesen werden?

Day  Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec. Year 
01  15.2 12.3 9.96 10.1 15.0 33.7 137 309 182 62.6 27.4 17.2 
02  14.9 12.3 9.96 9.96 16.4 38.2 109 342 197 69.9 25.4 16.6 
03  14.9 12.3 9.78 10.3 17.3 50.3 118 472 184 68.7 24.5 17.0 
04  14.6 12.3 9.69 10.3 18.7 58.1 152 275 190 68.7 24.5 16.6 
05  14.4 12.3 9.51 10.1 18.9 44.5 165 188 206 69.9 24.0 16.5 
06  14.1 12.3 9.41 10.3 19.8 44.8 142 157 192 62.2 23.8 16.1 
07  14.0 12.3 9.32 10.3 20.4 52.6 121 146 182 58.9 24.9 15.6 

ich diesen Code verwendet, um Daten zu lesen

data ='AQ404.7_01.txt' 
with open(data) as fo: 
    data = fo.readlines()[9:41] 
    df = data[1:32] 
    df = [d.strip() for d in df] 
    df = (np.array(df)) 
    column = data[0][:-6] 
    for string in (df): 
     df = string.split() 
     print df 

Aber das Problem ist, wenn ich die Daten für Februar geprüft, es 31 Daten gibt. Ich habe versucht zu lösen, aber nicht in der Lage zu tun.

Kann jemand helfen, dieses Problem zu lösen? Ich habe hier auch eine Datendatei angehängt. https://drive.google.com/file/d/0B2rkXkOkG7ExTlJ3VnExUHFZUzA/view?usp=sharing

+0

Verwenden Sie nicht 'np.array', bis Sie eine schöne Liste von Listen os Strings und/oder Floats erhalten. – hpaulj

+0

@hpaulj immer noch das Problem ist gleich :( – bikuser

Antwort

2

Sie sollen Fixed Width File Leser von Pandas verwenden:

So für die Eingabedatei die Liste der festen Breiten definieren:

#Define the column widths  
ws = [4,9,7,7,7,7,7,7,7,7,7,7,7] 

#read the file having the header row in the 9th line and read only 31 lines after that 
df = pd.read_fwf('AQ404.7_01.txt',widths=ws,header=9, nrows=31) 

print df 

enter image description here

+1

Sie können Feldbreiten in 'np.genfromtxt' auch angeben. – hpaulj

+0

@Abbas Vielen Dank .. Ihr Code ist sehr nützlich und unkompliziert :). – bikuser

1

Ich kopiere-n-klebte Ihre Probe zu meiner ipython Sitzung als ein mehrzeiliger Text und führte die folgenden genfromtxt:

In [281]: np.genfromtxt(txt.splitlines(),dtype=None,names=True,usecols=range(13)) 
Out[281]: 
array([(1, 15.2, 12.3, 9.96, 10.1, 15.0, 33.7, 137, 309, 182, 62.6, 27.4, 17.2), 
     (2, 14.9, 12.3, 9.96, 9.96, 16.4, 38.2, 109, 342, 197, 69.9, 25.4, 16.6), 
     (3, 14.9, 12.3, 9.78, 10.3, 17.3, 50.3, 118, 472, 184, 68.7, 24.5, 17.0), 
     (4, 14.6, 12.3, 9.69, 10.3, 18.7, 58.1, 152, 275, 190, 68.7, 24.5, 16.6), 
     (5, 14.4, 12.3, 9.51, 10.1, 18.9, 44.5, 165, 188, 206, 69.9, 24.0, 16.5), 
     (6, 14.1, 12.3, 9.41, 10.3, 19.8, 44.8, 142, 157, 192, 62.2, 23.8, 16.1), 
     (7, 14.0, 12.3, 9.32, 10.3, 20.4, 52.6, 121, 146, 182, 58.9, 24.9, 15.6)], 
     dtype=[('Day', '<i4'), ('Jan', '<f8'), ('Feb', '<f8'), ('Mar', '<f8'), ('Apr', '<f8'), ('May', '<f8'), ('Jun', '<f8'), ('Jul', '<i4'), ('Aug', '<i4'), ('Sep', '<i4'), ('Oct', '<f8'), ('Nov', '<f8'), ('Dec', '<f8')]) 

Ich musste usecols angeben, weil Sie 14 Namen in der Kopfzeile haben, aber nur 13 Felder in den Datenzeilen.

Beachten Sie, dass es ein 1d strukturiertes Array geladen hat. Auf die Spalten wird durch den Feldnamen zugegriffen, z. data['Jan'], nicht nach Nummer. werden die Daten von der 2. Dataline.

Wenn ich die Kopfzeile überspringen, ich es als ein 2D-Array von Schwimmern laden

In [284]: np.genfromtxt(txt.splitlines(),dtype=float,skip_header=1) 
Out[284]: 
array([[ 1. , 15.2 , 12.3 , 9.96, 10.1 , 15. , 33.7 , 
     137. , 309. , 182. , 62.6 , 27.4 , 17.2 ], 
     [ 2. , 14.9 , 12.3 , 9.96, 9.96, 16.4 , 38.2 , 
     109. , 342. , 197. , 69.9 , 25.4 , 16.6 ], 
     [ 3. , 14.9 , 12.3 , 9.78, 10.3 , 17.3 , 50.3 , 
     118. , 472. , 184. , 68.7 , 24.5 , 17. ], 
     [ 4. , 14.6 , 12.3 , 9.69, 10.3 , 18.7 , 58.1 , 
     152. , 275. , 190. , 68.7 , 24.5 , 16.6 ], 
     [ 5. , 14.4 , 12.3 , 9.51, 10.1 , 18.9 , 44.5 , 
     165. , 188. , 206. , 69.9 , 24. , 16.5 ], 
     [ 6. , 14.1 , 12.3 , 9.41, 10.3 , 19.8 , 44.8 , 
     142. , 157. , 192. , 62.2 , 23.8 , 16.1 ], 
     [ 7. , 14. , 12.3 , 9.32, 10.3 , 20.4 , 52.6 , 
     121. , 146. , 182. , 58.9 , 24.9 , 15.6 ]]) 

von scatch Arbeiten kann ich die Zeilen in eine Liste von Listen schalten mit:

ll = [] 
for line in txt.splitlines(): 
    ll.append(line.strip().split()) 

kann ich eine Liste von Listen von Schwimmern mit bekommen:

for line in txt.splitlines()[1:]: # skip the header 
    ll.append([float(i) for i in line.strip().split()]) 

, die in 2D-Array mit

np.array(ll) 

Wenn Leerraum Begrenzer genfromtxt nicht funktioniert, gedreht werden kann, akzeptiert auch eine Liste der Feldbreiten als ‚Trennzeichen‘. Sehen Sie sich die Dokumentation oder das Experiment an.

+0

vielen Dank :) – bikuser

Verwandte Themen