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('\n',''))
data = data.assign(屬性=data.屬性.str.replace('\n',''))
data = data.assign(線體=data.線體.str.replace('\n',''))
替換
data[['項目', '屬性', '線體']] = data[['項目', '屬性', '線體']].apply(lambda x: x.str.replace('\n', ''))
#第八步: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='\t', 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)