Я собираю данные таблицы из Google Finance через pd.read_html, а затем сохраняю эти данные в Excel через df.to_excel(), как показано ниже:

    dfs = pd.read_html('https://www.google.com/finance?q=NASDAQ%3AGOOGL&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM', flavor='html5lib')
    xlWriter = pd.ExcelWriter(output.xlsx, engine='xlsxwriter')

    for i, df in enumerate(dfs):
        df.to_excel(xlWriter, sheet_name='Sheet{}'.format(i))
    xlWriter.save()

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

8
gluc7 11 Дек 2016 в 01:30

4 ответа

Лучший ответ

Рассмотрите возможность преобразования числовых столбцов в числа с плавающей точкой, поскольку pd.read_html считывает веб-данные как строковые типы (т. Е. Объекты). Но перед преобразованием в числа с плавающей точкой вам необходимо заменить дефисы на NaN:

import pandas as pd
import numpy as np

dfs = pd.read_html('https://www.google.com/finance?q=NASDAQ%3AGOOGL' +
                   '&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM', flavor='html5lib')
xlWriter = pd.ExcelWriter('Output.xlsx', engine='xlsxwriter')
workbook = xlWriter.book

for i, df in enumerate(dfs):
    for col in df.columns[1:]:                  # UPDATE ONLY NUMERIC COLS 
        df.loc[df[col] == '-', col] = np.nan    # REPLACE HYPHEN WITH NaNs
        df[col] = df[col].astype(float)         # CONVERT TO FLOAT   

    df.to_excel(xlWriter, sheet_name='Sheet{}'.format(i))

xlWriter.save()
5
Parfait 11 Дек 2016 в 04:42

В дополнение к другим решениям, где строковые данные преобразуются в числа при создании или использовании фрейма данных, это также возможно сделать с помощью опций механизма xlsxwriter:

writer = pd.ExcelWriter('output.xlsx',
                        engine='xlsxwriter',
                        options={'strings_to_numbers': True})

Из документов:

strings_to_numbers . Включите метод worksheet.write() для преобразования строк в числа, где это возможно, используя float(), чтобы избежать предупреждения Excel о «Числа, хранящиеся в виде текста». ,

12
jmcnamara 9 Авг 2017 в 08:55

Начиная с pandas 0.19, вы можете предоставить аргумент na_values для pd.read_html, который позволит пандам правильно автоматически выводить тип float для ваших ценовых столбцов ...

Вот как это будет выглядеть:

dfs = pd.read_html(
    'https://www.google.com/finance?q=NASDAQ%3AGOOGL&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM',
    flavor='html5lib',
    index_col='\nIn Millions of USD (except for per share items)\n',
    na_values='-'
)

xlWriter = pd.ExcelWriter('Output.xlsx', engine='xlsxwriter')
for i, df in enumerate(dfs):
    df.to_excel(xlWriter, sheet_name='Sheet{}'.format(i))
xlWriter.save()

В качестве альтернативы (если у вас еще нет панд 0.19), я бы использовал более простую версию решения @ Parfait:

dfs = pd.read_html(
    'https://www.google.com/finance?q=NASDAQ%3AGOOGL&fstype=ii&ei=9YBMWIiaLo29e83Rr9AM',
    flavor='html5lib',
    index_col='\nIn Millions of USD (except for per share items)\n'
)

xlWriter = pd.ExcelWriter('Output.xlsx', engine='xlsxwriter')
for i, df in enumerate(dfs):
    df.mask(df == '-').astype(float).to_excel(xlWriter, sheet_name='Sheet{}'.format(i))
xlWriter.save()

Это второе решение работает только в том случае, если вы правильно определите индексный столбец (в .read_html), он потерпит неудачу с ValueError, если один из столбцов (data) содержит что-либо, что не можно преобразовать в число с плавающей точкой. ...

1
Bluu 9 Авг 2017 в 05:40

Вы убедились, что экспортируемые вами столбцы на самом деле являются числами в python (int или float)?

Кроме того, вы можете преобразовать текстовые поля в числа в Excel, используя функцию = VALUE ().

1
Felix 10 Дек 2016 в 22:43