2016-07-07 6 views
3

Ich habe eine CSV-Datei mit einer Liste von Proben verschiedener Parameter von Beschleunigungsmesser und gyroskopischen Daten. Es enthält Floats (IQR, Range, MAD, ...) und Arrays (ZCD-Werte). Wenn ich es zurücklese, werden sie als Strings zurückgegeben und für meine Verarbeitung brauche ich Zahlen (int/float). Ich versuchteListe mit Arrays von CSV-Datei in Floats konvertieren

results = map(int, results) 

und

results = [int(i) for i in results] 

Ich habe sich von here, aber ich habe ein Problem mit dem Arrays mit.

Traceback (most recent call last): 
File "/home/pi/Desktop/imu/mpu_v16.py", line 458, in <module> 
    main() 
File "/home/pi/Desktop/imu/mpu_v16.py", line 439, in main 
    compare() 
File "/home/pi/Desktop/imu/mpu_v16.py", line 305, in compare 
    nrow = [float(i) for i in nrow] 
ValueError: could not convert string to float: [ 53 73 79 139] 

Wie kann ich das lösen?

Ich füge eine Probe meiner Daten:

C,3.3440452548950501e-17,0.99999999999999645,0.89244290726827058,1.7947499048650259,3.3651560716219242,[108 123 149 220 235],0.99999999999999822,110223.99999999971,331.99999999999915,-5.9524005537131887e-17,0.99999999999999989,0.81051947660768831,1.4756039753111405,4.4268119259334213,[103 122 160 205 212],0.99999999999999989,110224.00000000001,332.00000000000006,-6.4540073419474463e-17,0.999999999999999,0.74198651253618131,0.63512619216067612,4.256170326687128,[106 164 192 226],0.99999999999999933,110224.00000000001,332.00000000000006,2.083131190971185e-16,1.0000000000000009,0.66659374901400581,0.52759419283475883,4.5104130995285256,[ 7 14 45 56 150 327],1.0000000000000002,110223.99999999994,331.99999999999983,-3.0890618042093025e-17,0.99999999999999667,0.58289607514346964,0.21669963911591134,4.7919240951669444,[ 82 149 208],0.99999999999999822,110223.99999999942,331.99999999999824,-3.2771643497971487e-16,1.0000000000000009,0.58746356061392535,0.29681486739557372,5.2741718744905794,[ 26 48 59 66 114 171 231 242],1.0000000000000002,110224.00000000036,332.00000000000108,-0.57536274345915739,0.147595080030029,0.13018399571123057 
+0

Das Problem, das ich in dem Fehler, den Sie veröffentlicht haben, ist, dass Sie versuchen, ein Array von Zeichenfolgen in Float zu konvertieren, während Sie Int() einzeln anwenden sollten. Als schnelle und schmutzige Lösung wenden Sie eine andere for-Schleife an. – giosans

+0

Ihr csv enthält keine Zahlen, es enthält durch Leerzeichen getrennte Zahlenfolgen. – MisterMiyagi

+0

Sieht aus, als hätten Sie numpy array als String in die Datei geschrieben.Sie müssen die [] trennen und dann jede Zeile auf Whitespace teilen und jedes Element –

Antwort

1

Da die Eingabe von Zeichenketten von Schwimmern besteht und Streicher von Arrays, die Sie benötigen eine Art, zwischen den beiden zu unterscheiden. Eine Möglichkeit ist vielleicht, die Zeichenfolge nach Leerzeichen zu überprüfen? Dann, für Float-Strings, verwenden Sie einfach float(i), wie Sie es getan haben. Versuchen Sie dann bei Array-Strings, auf die Leerzeichen aufzuteilen, um die Array-Elemente zu trennen, und führen Sie dann float für jeden einzelnen String-Float (convert a string to an array) aus.

Willkürliche Schwimmer Eingang: "54.6"
prüfen Plätze: False
Call: float("54.6")

Willkürliche Array-Eingang: "[ 53 73 79 139]"
prüfen Plätze: True
Klammern entfernen: " 53 73 79 139"
Split auf Räume und speichern in einem Array: ["53","73","79","139"]
Call Float auf jedem Element: [53,73,79,139]

+0

, Ihre Lösung nicht genau mein Problem gelöst, aber half mir etwas. Ich hatte meine Speichermethode geändert, um dieses Array-Problem zu überwinden. –

1

Ihre csv ungültig ist, oder Sie es nicht richtig zu lesen. Was Sie extrahiert haben, sind keine einzelnen Zahlen, sondern mehrere Zahlen in Klammern. Siehe die Fehlermeldung:

ValueError: could not convert string to float: [ 53 73 79 139] 
      ###    This is your data^   ^

So haben Sie eine Liste wie ["[ 53 73 79 139]", "[ 123 12 11]"] haben, wenn Sie tatsächlich [["53", "73", "79", "139"], ["123", "12", "11"]] oder ["53", "73", "79", "139", "123", "12", "11"] haben sollte.

Wenn Ihr CSV falsch formatiert ist, können Sie dies korrigieren, indem Sie die fehlerhaften Werte aufteilen. Dies gibt Ihnen eine einfache Liste wie [53, 73, 79, 139]:

nrow = [float(i) for elem in nrow for i in elem.strip('[] ').split()] 
#    ^   ^extract every sequence of numbers 
#          ^   ^remove [] and whitespace around sequences 
#               ^ ^split the actual numbers 

Dies wird Ihnen eine Liste von Listen wie [[ 53, 73, 79, 139], ...]:

nrow = [[float(i) for i in elem.strip('[] ').split()] for elem in nrow ] 
Verwandte Themen