Pandas:to_excel時如何不覆蓋之前的Excel表、ExcelWriter類


如果只是想把一個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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM