我正在通过pd.read_html从Google财经中抓取表格数据,然后通过df.to_excel()
将该数据保存到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时,如何将它们存储为实际值而不是文本?
答案 0 :(得分:10)
除了在创建或使用数据帧时将字符串数据转换为数字的其他解决方案之外,还可以使用xlsxwriter
引擎的选项来执行此操作:
writer = pd.ExcelWriter('output.xlsx',
engine='xlsxwriter',
options={'strings_to_numbers': True})
来自docs:
strings_to_numbers
:启用worksheet.write()
方法,尽可能使用float()
将字符串转换为数字,以避免出现关于&#34的Excel警告;数字存储为文本"。
答案 1 :(得分:3)
考虑将数字列转换为浮点数,因为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()
答案 2 :(得分:3)
这可能是因为显示警告的那些列的数据类型是objects
,而不是数值类型,例如int
或float
。
为了检查DataFrame每一列的数据类型,请使用dtypes
,例如
print(df.dtypes)
在我的情况下,存储为对象而不是数字的列为PRECO_ES
在我的特殊情况下,十进制数字是相关的,因此我已使用astype
将其转换为浮点数,如下所示:
df['PRECO_ES'] = df['PRECO_ES'].astype(float)
如果再次检查数据类型,则会得到以下信息
然后,您要做的就是将DataFrame导出到Excel
#Export the DataFRame (df) to XLS
xlsFile = "Preco20102019.xls"
df.to_excel(xlsFile)
#Export the DataFRame (df) to CSV
csvFile = "Preco20102019.csv"
df.to_csv(csvFile)
如果我随后打开Excel文件,则可以看到警告不再显示,因为这些值存储为数字而不是文本
答案 3 :(得分:1)
您是否验证了导出的列实际上是python(int或float)中的数字?
或者,您可以使用= VALUE()函数将文本字段转换为Excel中的数字。
答案 4 :(得分:1)
由于pandas 0.19,您可以将参数na_values提供给pd.read_html,这将允许pandas正确地自动推断浮动类型到您的价格列......
以下是这样的结果:
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()
或者(如果你还没有pandas 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失败到一个漂浮......
答案 5 :(得分:0)
如果您希望Excel工作表具有字符串数据类型,请按照以下步骤操作:
for col in original_columns:
df_employees[col] = df_employees[col].astype(pd.StringDtype())