繁体   English   中英

将 Pandas 数据框导出到 Excel 多表文件的正确方法是什么?

[英]What is the right way to export Pandas dataframe to Excel multi-sheet file?

我需要将两个经过清理和重新计算的数据帧作为单独的工作表输出到 Excel 文件中。 这段代码有效,但在 Excel 中打开生成的文件会产生“文件损坏”——它被修复并在之后打开正常,但这很烦人。

代码在 Azure Jupiter Notebook、Python 3.6 上,我下载 Excel 文件并在 Excel 365、Win 10 中打开。

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('PR_weatherGDDid.xlsx', engine='xlsxwriter') 

# Write each dataframe to a different worksheet.
df.to_excel(writer, sheet_name='Daily', index=False)     
doystats.to_excel(writer, sheet_name='stats')    

# Close the Pandas Excel writer and output the Excel file.
writer.save()

所以:Excel 文件已创建,但在 Excel 中打开时出现问题。

这是正确的方法。

>>> with pd.ExcelWriter('PR_weatherGDDid.xlsx') as writer: 
...     df.to_excel(writer, sheet_name='Daily')
...     doystats.to_excel(writer, sheet_name='stats')

这是我的代码,我可以正常打开 Excell 文件:

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('PR_weatherGDDid.xlsx') 

data = [['AMN987','Ok'],['AMN987','Ok'],['AMN987','Error'], ['BBB987','Ok'],['BBB987','Ok'],['CCC','Error']]
df = pd.DataFrame(data, columns=['Serial', 'Status'])

days_to = [['02/08/19',4],['02/08/19',8],['02/08/19',3], ['02/08/19',6],['02/08/19',0],['02/08/19',9]]
doystats = pd.DataFrame(days_to, columns=['Date', 'Day'])

# Write each dataframe to a different worksheet.
df.to_excel(writer, sheet_name='Daily', index=False)     
doystats.to_excel(writer, sheet_name='stats')    

# Close the Pandas Excel writer and output the Excel file.
writer.save()
writer.close()

输出如下所示:

在此处输入图片说明 在此处输入图片说明

Excel 只在“修复”后打开创建的文件的问题似乎源于文件是在 Azure Jupiter notebook 在线创建的。 所有 3 个代码变体(我的并由 @atlas 和 @sharif 建议)在在线环境中生成了需要“修复”的文件,但是当我通过本地安装的 Jupiter Notebooks (Anaconda) 运行它时生成了普通的 Excel 文件。

正如 Larisa Golovko 指出的那样,这似乎只是 Azure Notebooks 上的 XlsxWriter 的问题。 离线环境中的 XlsxWriter、Pandas 或 Jupyter 不会发生这种情况。

在这里深入研究了一点,看起来 xlsx 存档中的 .rels 文件存在 zipfile 压缩错误。 目前我不知道是什么原因造成的,但它似乎与该环境中的标准 Python zipfile 库有关。 我将尝试在没有 XlsxWriter 的情况下组合一个更简单的测试用例。

解决方法是使用 XlsxWriter in_memory构造函数选项:

workbook = xlsxwriter.Workbook('hello_world.xlsx', {'in_memory': True})

# Or:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM