社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

蚂蚁学Python • 4 年前 • 567 次点击  

前言:

今天接到一个私活,是要求通过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