2011-08-18 23 views
15

Tengo un archivo CSV con lectura de datos que quiero leer en Python. Obtengo listas que contienen cadenas como "2,5". Ahora, hacer float("2,5") no funciona, porque tiene la marca decimal incorrecta.Convertir marca decimal

¿Cómo leo esto en Python como 2.5?

+0

¿verificó: http://pypi.python.org/pypi/Babel/0.9.6 – mouad

Respuesta

16

float("2,5".replace(',', '.')) va a hacer en la mayoría de los casos

Si value es un número grande y . se ha utilizado durante miles, puede:

Reemplazar todas las comas por puntos: value.replace(",", ".")

quita todos pero la último punto: value.replace(".", "", value.count(".") -1)

+14

Sólo por curiosidad, es Es la solución verdadera? Se ve horrible para mí. – agibalov

+0

@ loki2302 - El delimitador decimal estándar es un punto. Si usa cualquier otra cosa (es decir, coma o algo más "exótico" como el espacio, una letra o cualquier otra cosa), entonces tiene que reemplazarlo para que 'float() 'entienda lo que quiere decir. – eumiro

+0

El delimitador decimal es un problema de [localización] (http://en.wikipedia.org/wiki/Decimal_point#Hindu-Arabic_numeral_system), así que supongo que @ loki2302 se pregunta si hay una forma de informar python a _adhere_ a la ruta localizada de representar un número de coma flotante al analizar. –

2

Intente reemplazar todas las comas decimales con puntos decimales:

floatAsStr = "2,5" 
floatAsStr = floatAsStr.replace(",", "."); 
myFloat = float(floatAsStr) 

La función replace, por supuesto, funciona en cualquier subcadena ya que python diferencia ahora entre char y string.

+10

'str' es un nombre de variable malo, malo. – eumiro

+0

tiene razón, acabo de copiar el código de una página de tutorial y agregué la última línea ... – penelope

3

usando una expresión regular será más fiable

import re 

decmark_reg = re.compile('(?<=\d),(?=\d)') 

ss = 'abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3)' 

print ss 
print decmark_reg.sub('.',ss) 

resultado

abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3) 
abc , 2.5 def ,5.88 or (2.5, 8.12, 8945.3) 

Si desea tratar los casos más complejos (números con ningún dígito antes de la marca decimal para exemple) la expresión regular Construí para detectar todo tipo de números en el siguiente subproceso puede ser de su interés:

stackoverflow.com/questions/5917082/regular-expression-to-match-numbers-with-or-without-commas-and-decimals-in-text/5929469

+0

¿Cómo se puede hacer esto en un marco de datos de pandas (no en una cadena)? – hhh

46

Usted puede hacerlo el entorno local de manera consciente:

import locale 

# Set to users preferred locale: 
locale.setlocale(locale.LC_ALL, '') 
# Or a specific locale: 
locale.setlocale(locale.LC_NUMERIC, "en_DK.UTF-8") 

print locale.atof("3,14") 

Leer this sección antes de utilizar este método.

+1

Uno también debe tener en cuenta que esto no será seguro para subprocesos: http://stackoverflow.com/questions/2186327/thread-safe-locale-techniques –

Cuestiones relacionadas