2017-10-19 31 views
2

J'ai un fichier * .dat. Je connais les endroits où je veux diviser le fichier. Ils sontFichier Split * .dat avec largeur fixe avec chaque largeur connue

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

Cependant, les pandas géants read_fwf prend les valeurs dans le format:

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

Comment puis-je convertir les valeurs ci-dessus pour les valeurs ci-dessous?

Répondre

2

Le paramètre colspecs de read_fwf utilise les demi-ouvertes, donc en fait, il attend

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

Si vous ajoutez cumulativement les largeurs , Vous obtenez votre départ (et fin) des indices:

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]) 

Et puis utilisez zip sur les extrémités inférieures et supérieures:

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

J'utiliser numpy cumsum:

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)] 

Modifier:

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

Désolé, ma question était mal, je ne savais pas que read_fwf lire un format différent. J'ai corrigé la question. – pnkjmndhl

+2

@pnkjmndhl alors au lieu de 'c + 1' utiliser seulement' c' – Dark