import pandas as pd
from GZKT.produce import Common as util
import sys
util.logger('程序开始时间')
#第一步:使用pandas读取excel
io = pd.io.excel.ExcelFile('E://广东空调/test.xlsx')
#第二步:以第二行作为列名
data =pd.read_excel(io, sheetname='Sheet1',header=1)
#第三步:修改列名
data.rename(columns={data.columns[2]:'属性', data.columns[3]:'明细'}, inplace = True)
#第四步:将日期列名放入列表,后面统一操作列表即可
value_vars=[]
for i in data.columns:
if i.find('/') !=-1:
value_vars.append(i)
if i.find('Unnamed') != -1 or i.find('合计') != -1:
#如果包含这些列就将其删除
data.drop([i], axis=1, inplace=True)
print('多余列删除成功')
#print(data.columns)
#第四步:针对指标值,进行空值替换,维度除外
data[value_vars] = data[value_vars].fillna(0)
#第五步:进行维度补充===>axis=1 代表对x轴操作,axis = 0 代表对y轴操作,limit参数表示填充多少个
data = data.fillna(method='ffill',axis=1).fillna(method="ffill",axis=0)
替换
data = data.ffill(axis=1).ffill(axis=0)
#第六步:删除没用的行,删除项目为差/变化点的行
data.dropna(how='all',inplace=True) #删除所有列都是空的行
data = data[~data.项目.isin(['差','变化点',''])]
#第七步:对文字还有特殊字符的进行更正,df.assign(coloname=)对字段重新渲染
data = data.assign(项目=data.项目.str.replace('
',''))
data = data.assign(属性=data.属性.str.replace('
',''))
data = data.assign(线体=data.线体.str.replace('
',''))
替换
data[['项目', '属性', '线体']] = data[['项目', '属性', '线体']].apply(lambda x: x.str.replace('
', ''))
#第八步:pd.melt列转行,将日期转成列,并且通过选中的value_vars,筛选指定列
data = pd.melt(data, id_vars=['线体', '项目', '属性', '明细'],value_vars=value_vars, var_name='日期',value_name='指标值')
#第九步,对字段顺序进行排序
sortColumn= ['日期','线体', '项目', '属性', '明细','指标值']
data=data.loc[:,sortColumn]
util.logger('sql入库开始时间')
#使用快速入库的方法
# 方法一,比较慢
# pd.io.sql.to_sql(data, 'PAPAGZ_PRODUCE_VISUAL_DATA', Common.getEngine(), if_exists='append', index=False)
# 方法二
util.getConn(data,'"PAPAGZ_PRODUCE_VISUAL_DATA"')
util.logger('入库结束')
util.logger('程序退出')
sys.exit()
#
# 今天刚试to_sql 在oracle下特慢,后来发现其实慢是因为没设置to_sql的dtype参数 例如这样设置后就特别快了 估计快千百倍
# def setdtypedict(df): dtypedict = {} for i, j in zip(df.columns, df.dtypes): if "object" in str(j): dtypedict.update({i: VARCHAR(256)}) if "float" in str(j): dtypedict.update({i: DECIMAL(19, 2)}) if "int" in str(j): dtypedict.update({i: DECIMAL(19)}) return dtypedict 使用 dtypedict = setdtypedict(df) pd.io.sql.to_sql(df, name=target_tab_name, con=conntarget, schema=schema, index = False, index_label = 'ID', if_exists='append',#fail append replace dtype=dtypedict, chunksize=10000)
#
函数:从一行中过滤信息
def fun(df, keyList):
df = pd.DataFrame
reSer = pd.Series[]
for i in range(len(df)):
row = df.loc[i]
for key in keyList:
if key in row.values:
return False
return True
--
Common.py
---------------------
from sqlalchemy import create_engine, engine
import datetime
from io import StringIO
def getEngine():
db_engine = create_engine('postgresql+psycopg2://'+'gpadmin'+':'+'gpadmin'+'@'+str('10.39.4.175') + '/' + 'pissh')
return db_engine
def getConn(df,table_name):
#获取csvIO
output = StringIO()
# ignore the index
df.to_csv(output, sep=' ', index = False, header = False)
output.getvalue()
output.seek(0)
#获取连接
engine = getEngine()
connection = engine.raw_connection() #engine 是 from sqlalchemy import create_engine
cursor = connection.cursor()
cursor.copy_from(output,table_name ,null='')
connection.commit()
cursor.close()
def logger(info):
print('时间:',datetime.datetime.now(),':',info)