• python pandas从excel中获取数据


    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)




    欢迎对it热情的同学,加qq进行技术讨论; QQ:850922253
  • 相关阅读:
    结构体字节对齐
    ORACLE自增长字段实现
    Oracle 11.2.0.2新特性——用户重命名(Rename User)
    oracle expdp/impdp 用法详解
    sql语句面试题(城市人口统计) .
    ORA30553: 函数不确定!
    SQL Express自动备份 .
    SQL 2005的DES加密算法
    SQL 2005加密数据方法
    CREATE VIEW ORA01031
  • 原文地址:https://www.cnblogs.com/zhangwensi/p/11290352.html
Copyright © 2020-2023  润新知