2017-10-19 2 views
2

Ich habe eine * .dat Datei. Ich kenne die Orte, an denen ich die Datei teilen möchte. Sie sindSplit * .dat Datei mit fester Breite mit jeder bekannten Breite

[5,5,10,10,10,10,10,5,5,10] 

jedoch die Pandas read_fwf die Werte im Format verwendet:

[(0, 5), (5, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 60), (60, 65), (65, 70), (70, 80)] 

Wie konvertiere ich die oben genannten Werte auf die folgenden Werte?

Antwort

2

Der colspecs Parameter von read_fwf verwendet halboffene Intervalle, also eigentlich erwartet, dass sie

[(0, 5), (5, 10), (10, 20), …] 

Wenn Sie die Breiten addieren

widths = [5,5,10,10,10,10,10,5,5,10] 
borders = np.cumsum([0] + widths) 
>>> array([ 0, 5, 10, 20, 30, 40, 50, 60, 65, 70, 80]) 

Und dann zip auf den unteren und oberen Enden verwenden: Sie Ihren Start (und Ende) Indizes erhalten

list(zip(borders[:-1], borders[1:])) 
>>> [(0, 5), (5, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 60), (60, 65), (65, 70), (70, 80)] 
4

I numpy cumsum verwenden würde:

In [11]: c = np.cumsum([5,5,10,10,10,10,10,5,5,10]) 

In [12]: s = np.insert(c + 1, 0, 0) 

In [13]: list(zip(s, c)) 
Out[13]: 
[(0, 5), 
(6, 10), 
(11, 20), 
(21, 30), 
(31, 40), 
(41, 50), 
(51, 60), 
(61, 65), 
(66, 70), 
(71, 80)] 

bearbeiten:

s = np.insert(c, 0, 0) 
list(zip(s,c)) 

[(0, 5),(5, 10),(10, 20), (20, 30), (30, 40), (40, 50), (50, 60), (60, 65), (65, 70), (70, 80)] 
+0

Sorry, meine Frage war falsch, ich nicht, dass wusste read_fwf gelesen ein anderes Format. Ich habe die Frage korrigiert. – pnkjmndhl

+2

@pnkjmndhl verwenden Sie dann anstelle von 'c + 1' nur' c' – Dark

Verwandte Themen