Конвертировать десятичную метку
У меня есть файл CSV с чтением данных, который я хочу прочитать в Python. Я получаю списки, содержащие строки типа "2,5"
. Теперь выполнение float("2,5")
не работает, потому что оно имеет неправильную десятичную метку.
Как я прочитал это в Python как 2.5
?
Ответы
Ответ 1
float("2,5".replace(',', '.'))
будет делать в большинстве случаев
Если value
- большое число, а .
используется для тысяч, вы можете:
Заменить все запятые для точек: value.replace(",", ".")
Удалите все, кроме последней точки: value.replace(".", "", value.count(".") -1)
Ответ 2
Вы можете сделать это с учетом языка:
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")
Перед использованием этого метода прочитайте этот раздел.
Ответ 3
Pandas поддерживает это из коробки:
df = pd.read_csv(r'data.csv', decimal=',')
См. http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
Ответ 4
с использованием регулярного выражения будет более надежным
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)
результат
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 )
Если вы хотите обрабатывать более сложные случаи (цифры без цифры до десятичной метки для примера), вам может быть интересным регулярное выражение I, созданное для обнаружения всех типов чисел в следующем потоке:
fooobar.com/questions/81407/...
Ответ 5
Попробуйте заменить все десятичные запятые на десятичные точки:
floatAsStr = "2,5"
floatAsStr = floatAsStr.replace(",", ".");
myFloat = float(floatAsStr)
Функция replace
, конечно, работает с любой подстрокой, поскольку python теперь различает char и строку.
Ответ 6
Сначала вы должны убедиться, какая локаль была использована для предоставления номера. Несоблюдение этого правила может привести к случайным проблемам.
import locale
loc = locale.getlocale() # get and save current locale
# use locale that provided the number;
# example if German locale was used:
locale.setlocale(locale.LC_ALL, 'de_DE')
pythonnumber = locale.atof(value)
locale.setlocale(locale.LC_ALL, loc) # restore saved locale