我需要将两个经过清理和重新计算的数据框作为单独的表格输出到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中无法打开。
答案 0 :(得分:4)
这是正确的方法。
>>> with pd.ExcelWriter('PR_weatherGDDid.xlsx') as writer:
... df.to_excel(writer, sheet_name='Daily')
... doystats.to_excel(writer, sheet_name='stats')
答案 1 :(得分:2)
这是我的代码,我可以打开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()
输出看起来像这样:
答案 2 :(得分:1)
Excel仅在“修复”后打开创建的文件的问题似乎源于在Azure木星笔记本电脑中在线创建文件的事实。这3种代码变体(由@atlas和@sharif推荐,由我提供)在联机环境中生成的文件需要“修复”,但是当我通过本地安装的Jupiter Notebook(Anaconda)运行该文件时,该文件成为普通的Excel文件。
答案 3 :(得分:1)
正如Larisa Golovko指出的那样,这似乎仅是Azure笔记本上的XlsxWriter的问题。在离线环境中,使用XlsxWriter,Pandas或Jupyter不会发生这种情况。
我进一步研究了here,看起来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})