Сбой преобразования чисел в цикле (python) - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь извлечь аномальные точки данных из большого файла CSV (~ 1e6 строк), в котором большинство точек данных имеют постоянное значение.Я написал код ниже, чтобы обнаружить значения ниже, чем константа.

constant = 1
try:
    fp = open('disk2.csv')
    for line in fp: 
        ch4 = float(line.split(",")[4]) #data from channel four is in the fifth column
        if ch4 < constant:
            print line.split(",")[0] #print first column

except:
    ch4 = 'Not found'
finally:
    fp.close()
    print(ch4,type(ch4))

печать возвращает следующее без дополнительных ошибок:

('Not found', <type 'str'>)

, если я изменю код на:

constant = 1
try:
    fp = open('disk2.csv')
    for line in fp: 
        ch4 = line.split(",")[4] #data from channel four is in the fifth column
        if ch4 < constant:
            print line.split(",")[0] #print first column

except:
    ch4 = 'Not found'
finally:
    fp.close()
    print(ch4,type(ch4))

Возвращает

(' 2.41650E+01', <type 'str'>)

Итак, файл csv читается как строка, и строку можно разделить на список с помощью команды split, но я не могу превратить элементы в списке в плавающие числа?

Ошибка была не в коде, а в моем файле CSV, который не содержал достаточно элементов в первой строке

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Обычно сравнивать поплавки - плохая практика.лучше использовать что-то вроде этого:

abs(float(ch4), constant) <= allowed_error

Где allow_error - это, например, небольшое значение, например 0,000001.Числа с плавающей запятой хранятся не так, как целые числа, а внутренняя 1.0 может быть 0.9999999 или 1.000001.

0 голосов
/ 26 октября 2018

В первом случае вы выполняете сравнение со значениями и изменяете формат с str на float для сравнения, как в if float(ch4) < constant. Обратите внимание, что вы не сохраняете значение как тип float, а просто конвертируете его прямо для этой конкретной оценки.

Во втором случае вы сравниваете str и int. Обратите внимание, что при использовании constant = 1 типом константы по умолчанию является int, а не float. Сказав это, вы сравниваете int и str. Для этой оценки ваш код будет сравнивать значения, кодируя строку как таковую в int. Например, в ASCII 'A' будет закодировано как 65. Строка будет преобразована в целочисленное представление, в зависимости от используемого кодирования, а затем будет использоваться для оценки.

Чтобы решить вашу проблему, вы должны сохранить значение в ch4 как float. Это можно сделать с помощью ch4 = float(line.split(",")[4]), который будет хранить значение в переменной float, в отличие от переменной str.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...