Целые числа из файлов Excel становятся числами с плавающей запятой?

Я использую xlrd для чтения данных из файлов Excel.

Для целых чисел, хранящихся в файлах, скажем, 63, xlrd интерпретирует его как 63.0 типа number.

Почему xlrd не может распознать 63 как целое число?

Предположим, что sheet.row(1)[0].value дает нам 63.0. Как я могу преобразовать его обратно в 63.


person Terry Li    schedule 11.01.2012    source источник
comment
Это будет просто int(yourfloat), не так ли? docs.python.org/library/functions.html#int. Я не буду публиковать в качестве ответа - я чувствую, что могу оскорбить вас и, вероятно, что-то упустил.   -  person stackuser10210    schedule 11.01.2012
comment
@ stackuser10210 Интересно, почему целое число 63 в электронной таблице становится 63,0.   -  person Terry Li    schedule 11.01.2012
comment
Без понятия. Я не знаком с xlrd и никогда не делал ничего подобного. Если они действительно являются целыми числами в Excel (например, A1 = 63,0, B1 = Int (A1), и вы получаете 63,0 от B1, то я могу понять проблему. Извините, у меня нет ответа.   -  person stackuser10210    schedule 12.01.2012
comment
В Excel нет целых чисел. Просто числа с плавающей запятой в перетаскивании.   -  person Steven Rumbalski    schedule 12.01.2012
comment
Поскольку по крайней мере 1.0.0 есть Тип Int64 (обратите внимание на заглавную I), который также может обрабатывать отсутствующие значения.   -  person Griffith Rees    schedule 11.03.2021


Ответы (6)


Просмотр различных типов ячеек в документации кажется, что для ячеек нет целочисленного типа, это просто числа с плавающей запятой. Следовательно, это причина, по которой вы получаете поплавки, даже когда вы написали целое число.

Чтобы преобразовать число с плавающей запятой в целое, просто используйте int:

>>> int(63.0)
63
>>> int(sheet.row(1)[0].value)
63
person jcollado    schedule 11.01.2012
comment
Бредовая терминология. 63.0 уже является целым числом. int(some_float) усекает свой аргумент до целого числа и возвращает это значение как объект int. - person John Machin; 12.01.2012
comment
Но как узнать, является ли это числом с плавающей запятой или целым числом? - person Jason S; 04.12.2015

Excel рассматривает все числа как числа с плавающей запятой. В общем, неважно, верно your_number % 1 == 0.0 или нет.

Пример: A1 = 63.0, B1 = 63, C1 = INT(A1), A2 = TYPE(A1), B2 = TYPE(B1), C2 = TYPE(C1) Вы увидите, что TYPE() возвращает 1 в каждом случае.

Из справки Excel:

If value is   TYPE returns 
Number        1 
Text          2 
Logical value 4 
Error value   16 
Array         64 

xlrd сообщает, что находит. xlrd не искажает ввод перед тем, как показать его вам. Преобразование столбца из (62.9, 63.0, 63.1, etc) в (62.9, 63, 63.1, etc) кажется мне бессмысленной тратой процессорного времени.

person John Machin    schedule 11.01.2012
comment
+1. Нет ничего лучше, чем услышать это прямо от автора xlrd. - person Steven Rumbalski; 12.01.2012

Ответ, данный jcollado, в порядке, если у вас есть все записи на листе Excel в виде чисел, которые являются целыми числами. Но предположим, что у вас есть число с плавающей запятой, вы всегда можете поставить условие проверки, например -

    if i==int(i): //checking for the integer:
      print int(i)      // solving your problem and printing the integer
    else:
      print i           //printing the float if present

Надеюсь, вы найдете это полезным :)

person minocha    schedule 11.01.2012

Мне вспоминается этот драгоценный камень из документов xlrd:

Даты в таблицах Excel

В реальности таких вещей нет. У вас есть числа с плавающей запятой и благочестивая надежда.

То же самое относится и к целым числам. Пожалуй, минус благочестивая надежда.

person Steven Rumbalski    schedule 11.01.2012

Начиная с версии 1.0.0, попробуйте convert_dtypes()

После этого полезного ответа на связанный вопрос: pandas.DataFrame.convert_dtypes пытается преобразовать столбцы в другие (в настоящее время экспериментальные) dtypes в возвращаемом DataFrame. Эти dtypes включают Int64, boolean и StringDtype, которые также обрабатывают отсутствующие значения. См. раздел Работа с текстовыми данными. для мотивации перехода на string столбцов и в этом разделе на логических операторах Клини, чтобы узнать о преимуществах столбца boolean.

person Griffith Rees    schedule 11.03.2021

Я написал код, который пытается преобразовать числа в строки, как они отображаются в Excel. Подход работает работает как минимум для целых чисел и чисел с двумя цифрами после запятой. Это должно работать и для многих других форматов.

Идея, скриншоты и код здесь: http://uucode.com/blog/2013/10/22/using-xlrd-and-formatting-excel-numbers/

person olpa    schedule 29.10.2013