Py学习  »  Python

Python私活案例,办公自动化处理水质数据

蚂蚁学Python • 2 年前 • 181 次点击  

前言:

今天接到一个私活,是要求通过python实现办公自动化的,我一看表格有点多,瞬间感觉到头大。当我静下心来看的时候,发现做这些表格用到的知识在蚂蚁老师的课上都有讲过,于是果断搞起。

任务说明:

表1和表2是每个月更新的数据,要求按照表3模板的格式,将表3红色方框中的数据进行更新,并且水质类别表的标题也进行更新。实现全部自动化。

表1:
表2:
表3:

一,读取表格数据

经过对表3的分析,首先我们要读取表1,表2中红色方框的数据,以及表三中断面名称。要实现一键自动化,那就将三个目标文件放在一个文件夹里,然后根据名称进行判断。

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 '-断面水质类别表' in file:
            file1 = file
        elif '年报' in file:
            file2 = file
        elif '国省控断面水质类别表' in file:
            file3 = file
print('断面水质类别文件1:',file1)
print('湖库水质文件2:',file2)
print('国省控断面文件3:',file3)

得到对应文件结果:

断面水质类别文件1:2022年3月-断面水质类别表.xlsx 湖库水质文件2:2022年3月-湖库水质月_季_年报  .xlsx 国省控断面文件3:2022年2月-(定)国省控断面水质类别表.xlsx

读取表1数据:

df1 = pd.read_excel(file1,header=1)
df1 = df1.iloc[1:,[3,6,7,8,9]]
df1.columns = ['断面名称','本月','上月','上年同期','超标污染物']
df1

读取表2数据:

df2 = pd.read_excel(file2,header=1)
df2_1 = df2.iloc[1:,[4,7,8,9,10]]
df2_1.columns = ['断面名称''本月''上月''上年同期''超标污染物']
df2_2 = df2.iloc[1:,13:19]
df2_1

读取表3中断面名称




    
app = xw.App(visible=False, add_book=False)
workbook = app.books.open(file3)
data1 = workbook.sheets['22个省控断面'].range('C3:C24').options(index=False).value
df3_1 = pd.Series(data1,name='断面名称')

然后将表1表2数据进行拼接,然后与表3的断面名称进行合并:

df1 = pd.concat([df1,df2_1],axis=0)
df_province = pd.merge(df3_1,df1,on='断面名称',how='left')
df_province

部分结果如下:

二,数据分析

下面就是要根据导出来的表对本月,上月,上年同期的类别进行数据分析了

df_province_data = df_province.loc[:,['本月','上月','上年同期']]
def get_tpye_data(df):
    # 获取单月df类别个数比例
    new_df = pd.DataFrame()
    ser = pd.Series(['Ⅰ类','Ⅱ类','Ⅲ类','Ⅳ类','Ⅴ类','劣Ⅴ类'],name='类别')
    # new_df['个数'] = df_province["本月"].value_counts()
    new_df['个数'] = df

    new_df = pd.merge(ser,new_df,how='left',left_on='类别',right_on=new_df.index,sort=True)
    new_df.set_index('类别',inplace=True)
    new_df.fillna(0, inplace=True)
    new_df.loc['总计'] = new_df.sum()
    new_df['比例'] = new_df.apply(lambda x: new_df['个数']/new_df.loc['总计','个数'])
    new_df['优良'] = new_df['比例']
    new_df.loc[['Ⅰ类','Ⅱ类'],'优良'] = new_df.loc['Ⅰ类','比例'] + new_df.loc['Ⅱ类','比例']
    new_df.loc['优良率'] = new_df.loc[['Ⅰ类','Ⅱ类','Ⅲ类'],'比例'].sum()
    new_df.loc[['总计','优良率'],['比例','优良']] = '—'
    new_df['个数'] = new_df['个数'].astype('int')
    new_df['类别'] = new_df.index

    new_df = new_df.reindex(columns=['类别','个数','比例','优良'])
    return new_df
benyue_df = get_tpye_data(df_province["本月"].value_counts())
benyue_df

得到单月的类别数据情况,结果如下:

通过调用函数分别的到不同月份的数据,并进行合并:

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

三,按照表格位置写入数据

最后就是数据写入文件了,由于表3中文件都是设置好的格式,比例导入后直接转成百分比;

写入表格标题:

month = file1.split('-')[0]
title_provice = workbook.sheets['22个省控断面'].range('A1').value   # 获得表格标题
workbook.sheets['22个省控断面'].range('A1').value = month + '-' + title_provice.split('-')[-1]  # 写入标题

写入水质类别表及营养指数:

workbook.sheets['22个省控断面'].range('C3:G24').value = df_province.values  
workbook.sheets['22个省控断面'].range('H24:M24').value = df2_2.values

写入类别数据:

workbook.sheets['22个省控断面'].range('I5:T12').value = df_province_data.values

更新当前数据月份文件名,并关闭表格:

f = re.sub('\w+月',month,file3)
workbook.save(f)
print(f,'文件保存完成')
workbook.close()
app.quit()

任务完成!只要好好听蚂蚁老师的课,这些python实现办公自动化的案例你也能搞定~


蚂蚁老师的全栈套餐,在抖音扫码购买;有答疑服务、副业介绍等福利



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132104
 
181 次点击