如果只是想把一個DataFrame保存為單獨的一個Excel文件,那么直接寫:
data.to_excel('xxx.excel','sheet1',index=False)
但是這樣做,只會保存為單個Excel文件和這個文件中的單個表。
如果先前存在有同名的Excel文件,這樣做會把之前的Excel文件覆蓋掉,不會起到在原文件中生成新的sheet的作用。
解決方法:
if not os.path.exists(mon_excel_path): data_write.to_excel(mon_excel_path, f'{mon}.{day}',encoding='GBK', header=['站點', '變化', '次數', '幅度/nt'], index=False) else: with pd.ExcelWriter(mon_excel_path, engine='openpyxl',mode='a') as writer: data_write.to_excel(writer,f'{mon}.{day}', header=['站點', '變化', '次數', '幅度/nt'], index=False)
上文各行代碼的解釋:
第一個if語句是在Excel文件不存在時,用於直接構建;
第二個if語句則是用ExcelWriter對已存在的Excel文件進行追加。
需要注意的是,如果Excel文件名含有中文,第一句的to_excel中的參數encoding需要寫為'GBK',否則會導致追加時生成ExcelWriter異常,報錯File is not a ZIP file。
補充
在Pandas 1.2.0版本之后(不含1.2.0),engine參數將棄用xlwt值,因此要使用xlwt引擎,請確保電腦上的pandas版本為1.2.0及以下,或者最好不使用xlwt。
下文是對ExcelWriter的補充說明,上文已經解決問題的可以不看下文。
ExcelWriter
pandas.ExcelWriter — pandas 1.3.3 documentation
構造
pd.ExcelWriter( path, engine=None, date_format=None, datetime_format=None, mode='w', storage_options=None, if_sheet_exists=None, engine_kwargs=None, **kwargs )
說明
這是一個用於把DataFrame對象寫入Excel表的輔助類。
默認情況下,用xlwt來寫xls,用openpyxl寫入xlsx,用odf寫入ods。如果想看一些更典型的用例,可以看DataFrame.to_excel
Writer構造時需要像打開文件那樣進行上下文管理,也就是,使用with語句塊的方式創建。不然的話就需要手動調用close()來關閉保存文件。
參數
參數 |
類型 |
默認值 |
說明 |
path | str | xls、xlsx、ods文件的路徑 | |
engine | str | 引擎 | |
date_format | str | date寫入Excel后的字符串格式('YYYY-MM-DD') | |
datetime_format | str | datetime寫入Excel后的字符串格式('YYYY-MM-DD HH:MM:SS') | |
mode | {'w','a'} | 'w' | 寫入模式,覆蓋還是追加 |
storage_options | dict | ||
if_sheet_exists | {'error','new','replace'} | 'error' | 嘗試寫入一個已經存在的sheet時的響應方式:錯誤、新建、替換 |
engine_kwargs | dict | 傳入引擎中的參數,從1.3.0才啟用的 |
例子
1、構造一個DataFrame,寫入xlsx中;
df = pd.DataFrame([["ABC", "XYZ"]], columns=["Foo", "Bar"]) with ExcelWriter("path_to_file.xlsx") as writer: df.to_excel(writer)
2、在同一個xlsx文件中,把兩個DataFrame分別寫入兩個SHEET中;
df1 = pd.DataFrame([["AAA", "BBB"]], columns=["Spam", "Egg"]) df2 = pd.DataFrame([["ABC", "XYZ"]], columns=["Foo", "Bar"]) with ExcelWriter("path_to_file.xlsx") as writer: df1.to_excel(writer, sheet_name="Sheet1") df2.to_excel(writer, sheet_name="Sheet2")
3、設置date和datetime的格式;
from datetime import date, datetime df = pd.DataFrame( [ [date(2014, 1, 31), date(1999, 9, 24)], [datetime(1998, 5, 26, 23, 33, 4), datetime(2014, 2, 28, 13, 5, 13)], ], index=["Date", "Datetime"], columns=["X", "Y"], ) with ExcelWriter( "path_to_file.xlsx", date_format="YYYY-MM-DD", datetime_format="YYYY-MM-DD HH:MM:SS" ) as writer: df.to_excel(writer)
4、往已存在的Excel中追加;
with ExcelWriter("path_to_file.xlsx",mode='a',engine='openpyxl') as writer: df.to_excel(writer,sheet_name='Sheet3')