Python私活案例,辦公自動(dòng)化處理水質(zhì)數(shù)據(jù)
前言:
今天接到一個(gè)私活,是要求通過(guò)python實(shí)現(xiàn)辦公自動(dòng)化的,我一看表格有點(diǎn)多,瞬間感覺(jué)到頭大。當(dāng)我靜下心來(lái)看的時(shí)候,發(fā)現(xiàn)做這些表格用到的知識(shí)在螞蟻老師的課上都有講過(guò),于是果斷搞起。
任務(wù)說(shuō)明:
表1和表2是每個(gè)月更新的數(shù)據(jù),要求按照表3模板的格式,將表3紅色方框中的數(shù)據(jù)進(jìn)行更新,并且水質(zhì)類(lèi)別表的標(biāo)題也進(jìn)行更新。實(shí)現(xiàn)全部自動(dòng)化。
表1:

表2:

表3:

一,讀取表格數(shù)據(jù)
經(jīng)過(guò)對(duì)表3的分析,首先我們要讀取表1,表2中紅色方框的數(shù)據(jù),以及表三中斷面名稱(chēng)。要實(shí)現(xiàn)一鍵自動(dòng)化,那就將三個(gè)目標(biāo)文件放在一個(gè)文件夾里,然后根據(jù)名稱(chēng)進(jìn)行判斷。
import?pandas?as?pd
import?xlwings?as?xw
import?os,re
file_list?=?os.listdir('./')
file1=''
file2?=?''
file3?=?''
for?file?in?file_list:
????if?file.endswith('xlsx'):
????????if?'-斷面水質(zhì)類(lèi)別表'?in?file:
????????????file1?=?file
????????elif?'年報(bào)'?in?file:
????????????file2?=?file
????????elif?'國(guó)省控?cái)嗝嫠|(zhì)類(lèi)別表'?in?file:
????????????file3?=?file
print('斷面水質(zhì)類(lèi)別文件1:',file1)
print('湖庫(kù)水質(zhì)文件2:',file2)
print('國(guó)省控?cái)嗝嫖募?:',file3)
得到對(duì)應(yīng)文件結(jié)果:
斷面水質(zhì)類(lèi)別文件1:2022年3月-斷面水質(zhì)類(lèi)別表.xlsx 湖庫(kù)水質(zhì)文件2:2022年3月-湖庫(kù)水質(zhì)月_季_年報(bào) ?.xlsx 國(guó)省控?cái)嗝嫖募?:2022年2月-(定)國(guó)省控?cái)嗝嫠|(zhì)類(lèi)別表.xlsx
讀取表1數(shù)據(jù):
df1?=?pd.read_excel(file1,header=1)
df1?=?df1.iloc[1:,[3,6,7,8,9]]
df1.columns?=?['斷面名稱(chēng)','本月','上月','上年同期','超標(biāo)污染物']
df1
讀取表2數(shù)據(jù):
df2?=?pd.read_excel(file2,header=1)
df2_1?=?df2.iloc[1:,[4,7,8,9,10]]
df2_1.columns?=?['斷面名稱(chēng)',?'本月',?'上月',?'上年同期',?'超標(biāo)污染物']
df2_2?=?df2.iloc[1:,13:19]
df2_1

讀取表3中斷面名稱(chēng):
app?=?xw.App(visible=False,?add_book=False)
workbook?=?app.books.open(file3)
data1?=?workbook.sheets['22個(gè)省控?cái)嗝?].range('C3:C24').options(index=False).value
df3_1?=?pd.Series(data1,name='斷面名稱(chēng)')
然后將表1表2數(shù)據(jù)進(jìn)行拼接,然后與表3的斷面名稱(chēng)進(jìn)行合并:
df1?=?pd.concat([df1,df2_1],axis=0)
df_province?=?pd.merge(df3_1,df1,on='斷面名稱(chēng)',how='left')
df_province
部分結(jié)果如下:
二,數(shù)據(jù)分析
下面就是要根據(jù)導(dǎo)出來(lái)的表對(duì)本月,上月,上年同期的類(lèi)別進(jìn)行數(shù)據(jù)分析了
df_province_data?=?df_province.loc[:,['本月','上月','上年同期']]
def?get_tpye_data(df):
????#?獲取單月df類(lèi)別個(gè)數(shù)比例
????new_df?=?pd.DataFrame()
????ser?=?pd.Series(['Ⅰ類(lèi)','Ⅱ類(lèi)','Ⅲ類(lèi)','Ⅳ類(lèi)','Ⅴ類(lèi)','劣Ⅴ類(lèi)'],name='類(lèi)別')
????#?new_df['個(gè)數(shù)']?=?df_province["本月"].value_counts()
????new_df['個(gè)數(shù)']?=?df
????new_df?=?pd.merge(ser,new_df,how='left',left_on='類(lèi)別',right_on=new_df.index,sort=True)
????new_df.set_index('類(lèi)別',inplace=True)
????new_df.fillna(0,?inplace=True)
????new_df.loc['總計(jì)']?=?new_df.sum()
????new_df['比例']?=?new_df.apply(lambda?x:?new_df['個(gè)數(shù)']/new_df.loc['總計(jì)','個(gè)數(shù)'])
????new_df['優(yōu)良']?=?new_df['比例']
????new_df.loc[['Ⅰ類(lèi)','Ⅱ類(lèi)'],'優(yōu)良']?=?new_df.loc['Ⅰ類(lèi)','比例']?+?new_df.loc['Ⅱ類(lèi)','比例']
????new_df.loc['優(yōu)良率']?=?new_df.loc[['Ⅰ類(lèi)','Ⅱ類(lèi)','Ⅲ類(lèi)'],'比例'].sum()
????new_df.loc[['總計(jì)','優(yōu)良率'],['比例','優(yōu)良']]?=?'—'
????new_df['個(gè)數(shù)']?=?new_df['個(gè)數(shù)'].astype('int')
????new_df['類(lèi)別']?=?new_df.index
????new_df?=?new_df.reindex(columns=['類(lèi)別','個(gè)數(shù)','比例','優(yōu)良'])
????return?new_df
benyue_df?=?get_tpye_data(df_province["本月"].value_counts())
benyue_df
得到單月的類(lèi)別數(shù)據(jù)情況,結(jié)果如下:

通過(guò)調(diào)用函數(shù)分別的到不同月份的數(shù)據(jù),并進(jìn)行合并:
shangyue_df?=?get_tpye_data(df_province["上月"].value_counts())
qunian_df?=?get_tpye_data(df_province["上年同期"].value_counts())
df_all?=?pd.concat([benyue_df,shangyue_df,qunian_df],axis=1,join='outer',ignore_index=False)
df_all

三,按照表格位置寫(xiě)入數(shù)據(jù)
最后就是數(shù)據(jù)寫(xiě)入文件了,由于表3中文件都是設(shè)置好的格式,比例導(dǎo)入后直接轉(zhuǎn)成百分比;
寫(xiě)入表格標(biāo)題:
month?=?file1.split('-')[0]
title_provice?=?workbook.sheets['22個(gè)省控?cái)嗝?].range('A1').value???#?獲得表格標(biāo)題
workbook.sheets['22個(gè)省控?cái)嗝?].range('A1').value?=?month?+?'-'?+?title_provice.split('-')[-1]??#?寫(xiě)入標(biāo)題
寫(xiě)入水質(zhì)類(lèi)別表及營(yíng)養(yǎng)指數(shù):
workbook.sheets['22個(gè)省控?cái)嗝?].range('C3:G24').value?=?df_province.values??
workbook.sheets['22個(gè)省控?cái)嗝?].range('H24:M24').value?=?df2_2.values
寫(xiě)入類(lèi)別數(shù)據(jù):
workbook.sheets['22個(gè)省控?cái)嗝?].range('I5:T12').value?=?df_province_data.values
更新當(dāng)前數(shù)據(jù)月份文件名,并關(guān)閉表格:
f?=?re.sub('\w+月',month,file3)
workbook.save(f)
print(f,'文件保存完成')
workbook.close()
app.quit()
任務(wù)完成!只要好好聽(tīng)螞蟻老師的課,這些python實(shí)現(xiàn)辦公自動(dòng)化的案例你也能搞定~
螞蟻老師的全棧套餐,在抖音掃碼購(gòu)買(mǎi);有答疑服務(wù)、副業(yè)介紹等福利

