本文示例程序的功能是将定期更新的多个固定格式表格(内含多个sheet页,每个sheet页数据格式也固定)数据整合成一张结构化表格。仅做个人积累记录使用,如有侵权或不合规请及时联系处理~
存放在一个文件夹中的历史表格,每个表格名称除日期部分按期变更,名称中其他部分保持不变。
打开每个表格数据格式如下所示(已清空涉敏数据),内含多个sheet页,每个sheet数据格式相同。
经过python自动化处理脚本整合后的表格(已清空涉敏数据),仅为一个表格一个sheet页。
import time
import os.path
import pandas as pd
from sqlalchemy import create_engine
import psycopg2
start =time.clock()
#待整合的表格文件存放路径
path = "D:/mywork/data/整合前"
#初始化一个空的dataframe
df = pd.DataFrame(columns=['单位','年月','年份','月份','序号', '行业','完成减少户数w','完成减少容量wkW','10kV及以上完成减少户数w','10kV及以上完成减少容量wkW','10kV以下完成减少户数w','10kV以下完成减少容量wkW'])
#获取path目录下的所有表格名,只允许存待整合的表格文件
file_name=os.listdir(path)
for i in file_name:
ny0=i[0:4]+i[5:7] #提取年月str
ny=pd.to_datetime(ny0, format='%Y%m') #日期转换
nf=int(i[0:4]) #提取年份int
yf=int(i[5:7]) #提取月份int
#读表格获取sheet名称
file_path=path+'/'+i
table = pd.read_excel(file_path, sheet_name=None)
sheet_name=list(table.keys())
#剔除不需要的sheet
index_to_delete = [0,15]
sheet_name=[sheet_name[i] for i in range(0, len(sheet_name), 1) if i not in index_to_delete]
#读sheet获取数据
for j in sheet_name:
print("正在读取 " + ny0 + ' ' + j)
sheetdata0=table[j]
#指定行和列获取数据
sheetdata=sheetdata0.iloc[8:141,[0,1,14,15,16,17,18,19]]
#创建列名
sheetdata.columns = ['序号', '行业','完成减少户数w','完成减少容量wkW','10kV及以上完成减少户数w','10kV及以上完成减少容量wkW','10kV以下完成减少户数w','10kV以下完成减少容量wkW']
#添加辅助列
sheetdata['统计类型']='当期'
sheetdata['单位']=j
sheetdata['年月']=ny
sheetdata['年份']=nf
sheetdata['月份']=yf
#union每个表格每个sheet数据
df = pd.concat([df, sheetdata], ignore_index=True)
#地市名称映射
df['地市']=df['单位']
dsys={
'鄂州供电公司':'鄂州市',
'恩施供电公司':'恩施土家族苗族自治州',
'黄冈供电公司':'黄冈市',
'黄石供电公司':'黄石市',
'荆门供电公司':'荆门市',
'荆州供电公司':'荆州市',
'神农架林区供电公司':'神农架林区',
'十堰供电公司':'十堰市',
'随州供电公司':'随州市',
'武汉供电公司':'武汉市',
'咸宁供电公司':'咸宁市',
'襄阳供电公司':'襄阳市',
'孝感供电公司':'孝感市',
'宜昌供电公司':'宜昌市',
'湖北省电力公司':'湖北省'
}
for k,v in dsys.items():
df.loc[df['单位'] == k,'地市'] = v
#字段数据类型强制转换
szlx=['完成减少户数w','完成减少容量wkW','10kV及以上完成减少户数w','10kV及以上完成减少容量wkW','10kV以下完成减少户数w','10kV以下完成减少容量wkW']
for i in range(0,len(szlx)):
df[szlx[i]]=pd.to_numeric(df[szlx[i]], errors='ignore')
#存储至python脚本所在路径
df.to_excel('整合后.xlsx')
#存储至本地数据库
engine =create_engine('postgresql+psycopg2://postgres:pass@word@localhost:5432/postgres')
try:
df.to_sql('ds_fhy_ykdqjs',engine,schema='yxyw',index=False,if_exists='replace')
except Exception as e:
print(e)
end = time.clock()
print('Running time: %s Seconds'%(end-start))