吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3809|回复: 44
收起左侧

[讨论] Python写的excel数据整理自动化程序,效率有点慢啊

  [复制链接]
贪恋鱼 发表于 2022-3-6 19:26
自己自学写的程序,可以实现功能,减少了我4个小时的工作量,还不错,就是感觉写的有点乱,效率也不是很高,有没有高手优化下
[Python] 纯文本查看 复制代码
import pandas as pd
import time
import openpyxl as op
import os
# 设置预读取文件路径path_file
print("**********************************\n"
      "1-请将原有的总数居复制到程序目录下,并将文件夹改名为总数据\n"
      "2-输入采气日报路径\n"
      "3-按Enter键执行程序\n"
      "4-等待程序运行完成\n"
      "***********************************\n")
path_file = str(input('请输入采气日报路径,以文件名结尾:\n'))
# print('请输入采气日报路径,以文件名结尾:\n')
# path_file = sys.stdin.readline()
# 建立月数据目录

if not os.path.exists("月数据"):
    os.mkdir("月数据")
# 读取采气日报所有工作表数据
M_Date = pd.read_excel(path_file, sheet_name=None, header=3,
                       names=['井号', '生产层位', '生产时间', '井口油压', '井口套压', '井口温度', '日产气', '日产水', '日注醇', '集气方式',
                              '采气方式', '单井动态'], usecols="B,C,D,E,F,G,J,M,P,S,T,U",
                       )
# print(type(M_Date))
excel_f = pd.ExcelFile(path_file)
# 获取所有工作表名
names = excel_f.sheet_names
# 删除第一个和最后一个工作表
del names[0]
del names[-1]


# 分割日期函数,传入的是以日期为工作表名的列表,返回处理好的日期列表
def fg_riqi(riqi):
    ret_riqi = []
    dq_riqi = time.strftime("%Y")
    for r in riqi:
        r_array = r.split('.')
        ret_riqi.append(f"{dq_riqi}年{r_array[0]}月{r_array[1]}日")
    return ret_riqi


# 新建excel
def add_excel(ff):
    wb = op.Workbook()
    wb.save(f"月数据/{ff}#集气站.xlsx")
    wb.close()
    return f"月数据/{ff}#集气站.xlsx"


# 读取集气站所有气井数据,传入的参数为:起始行s,结束行e,集气站站号j
def get_date(s, e, j):
    print("正在执行....请等待........")
    book_name = add_excel(j)
    writ = pd.ExcelWriter(book_name)
    # 遍历行数据 井号
    for row in range(s, e + 1):
        # 遍历所有日期工作表中行数据
        all_date = pd.DataFrame()
        for name in names:
            # 读取行数据
            all_date = all_date.append(M_Date[name].iloc[row])
        # print(all_date)
        scsj = fg_riqi(names)
        all_date.insert(2, '日期', scsj)
        all_date.to_excel(writ, sheet_name=all_date["井号"].iloc[3], index=False)
        writ.save()

    print(f"{j}#集气站-------已完成")


# 整理总数据,传递集气站序号如:1,20
def getdata_all(mi, ma):
    # 新建目录
    if not os.path.exists("新数据"):
        os.mkdir("新数据")
    for i in range(mi, ma + 1):
        print(f'{i}#正在整理,请稍等.....')
        if i == 11:
            continue
        else:

            all_date_path = f"总数据/{i}#动态分析数据.xlsx"
            fen_date_path = f"月数据/{i}#集气站.xlsx"

            data = pd.ExcelFile(all_date_path)
            data1 = pd.ExcelFile(fen_date_path)
            # 获取总数据指定工作博所有工作表名
            all_sht = data.sheet_names
            # 获取月数据指定工作博所有工作表名
            fen_sht = data1.sheet_names
            # 读取月数据工作博中所有工作表数据
            df_fen = pd.read_excel(fen_date_path, sheet_name=fen_sht)
            # 读取总数据工作博中所有工作表数据
            df_all = pd.read_excel(all_date_path, sheet_name=all_sht)

            # 新建工作表
            wb = op.Workbook()
            wb.save(f"新数据/{i}#动态分析数据.xlsx")
            wb.close()
            writ = pd.ExcelWriter(f"新数据/{i}#动态分析数据.xlsx")
            for st_all in all_sht:
                print('正在运行中...请勿关闭')
                for st_fen in fen_sht:
                    if st_fen == st_all:
                        df_new = df_all[st_all].append(df_fen[st_fen])
                        df_new.to_excel(writ, sheet_name=st_all, index=False)
                        time.sleep(0.5)
            writ.save()
            time.sleep(0.8)
        print(f'{i}#已执行完毕.....')
        time.sleep(2)
        del df_all
        del df_fen
        del df_new
        del data
        del data1
    print("**************已全部完成**********************************")


# 1站
get_date(0, 14, 1)
# 2站
get_date(19, 38, 2)
# 3站
get_date(43, 53, 3)
# 4站
get_date(58, 62, 4)
# 5站
get_date(67, 73, 5)
# 6站
get_date(78, 86, 6)
# 7站
get_date(91, 100, 7)
# 8站
get_date(105, 115, 8)
# 9站
get_date(120, 131, 9)
# 10站
get_date(136, 147, 10)
# 12站
get_date(152, 159, 12)
# 13站
get_date(164, 191, 13)
# 14站
get_date(196, 211, 14)
# 15站
get_date(216, 231, 15)
# 16站
get_date(236, 262, 16)
# 17站
get_date(267, 291, 17)
# 18站
get_date(296, 311, 18)
# 19站
get_date(316, 340, 19)
# 20站
get_date(345, 380, 20)
print("**************采集月数据已全部完成**********************************")

time.sleep(2)
print("**************开始合并整理总数据**********************************")

getdata_all(1, 20)

免费评分

参与人数 5吾爱币 +4 热心值 +5 收起 理由
xc_ + 1 + 1 我很赞同!
lzhpolk36 + 1 我很赞同!
jnez112358 + 1 + 1 谢谢@Thanks!
柯林志 + 1 + 1 我很赞同!
baggio_czm + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
244888888 发表于 2022-3-6 20:01
提示: 作者被禁止或删除 内容自动屏蔽
zhipin778 发表于 2022-3-6 20:08
君如兰 发表于 2022-3-6 20:32
感谢分享   不过有一说一 既然处理Excel  真不如看看宏
cheng050231 发表于 2022-3-6 20:49
vbs 来写不可以?
d8349565 发表于 2022-3-6 20:53
本帖最后由 d8349565 于 2022-3-6 20:55 编辑

我自己的一些笔记,供参考
[Python] 纯文本查看 复制代码
import pandas as pd

path = 'E:\python\测试\\数据查询.xlsx'
data = pd.DataFrame(pd.read_excel(path,sheet_name='Left',header=1,converters={'A': str}))     # converters={'A': str} 设置A列格式为文本

data.index                       # 查看索引
data.index.values
data.values                      # 查看数值
data.sort_index()                # 按索引排序
data.sort_values()               # 按数值排序
data.head( 5 )                   # 查看前5行
data.tail( 3 )                   # 查看后3行
data.values                      # 查看数值
datashape                        # 查看行数、列数
data.isnull()                    # 查找data中出现的空值
data.unique()                    # 查看唯一值
data.columns                     # 查看data的列名
data.sort_index()                # 索引排序 
data.sort_values()               # 值排序

pd.merge(data1,data2)            # 合并,以下为左连接
pd.merge(data1,data2,on=[a],how='left') 
'''
'left':merge时,以左边表格的键为基准进行配对,如果左边表格中的键在右边不存在,则用缺失值NaN填充。
'right':merge时,以右边表格的键为基准进行配对,如果右边表格中的键在左边不存在,则用缺失值NaN填充。
'''
pd.concat([data1,data2],axis=0)  # 合并,与merge的区别,自查(特别注意要使用[])
pd.concat([data01,data02,data03],axis=1)             # 合并横向拼接
pd.pivot_table( data )           # 用df做data透视表(类似于Excel的数透)

data.reset_index()               # 修改、删除原有索引
data.reindex()                   # 重置索引,如下示例
data.index = range(len(data))    # 重置索引,从0开始

a=data['x']                      # 取列名为'x'的列,格式为series
b=data[['x']]                    # 取列名为'x'的列,格式为Dataframe
c=data[['w','z']]                # 取多列时需要用Dataframe的格式
data.loc['A']                    # 取行名为'A'的行
data.loc[:,['x','z'] ]           # 表示选取所有的行以及columns为x,z的列
data['name'].values              # 取列名为'name'的列的值(取出来的是array而不是series)取单行后是一个Series,Series有index而无columns,可以用name来获取单列的索引
data.head(4)                     # 取头四行
data.tail(3)                     # 取尾三行
data= data.iloc[2:, 2:20]        # 选择2行开始、2-11列
[m, n] = data.shape              # 对m,n进行复制,m等于最大行数  n等于最大列数

df.drop([0],axis=0)                                 
data.notnull()                   # 非空值
data.dropna()                    # 删除空值
data.dropna()                    # 删除有空值的行
data.dropna(axis=1)              # 删除有空值的列
data.dropna(how='all')           # 删除所有值为Nan的行
data.dropna(thresh=2)            # 至少保留两个非缺失值
data.strip()                     # 去除列表中的所有空格与换行符号
data.fillna(0)                   # 将空值填充0
data.replace(1, -1)              # 将1替换成-1

data.fillna(100)                      # 填充缺失值为100
data.fillna({'语文':100,'数学':100,})        # 不同列填充不同值
data.fillna(method='ffill')                 # 将空值填充为上一个值
data.fillna(method='bfill')                 # 将空值填充下一个值
data.fillna(method='bfill',limit=1)         # 将空值填充下一个值,限制填充数量为1



# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)

# 打印表头列表
print(data.columns.tolist())

# 转换为时间列
data['有效起始日期'] = pd.to_datetime(data['有效起始日期'])

# 转换为时间
df["date"] = pd.to_datetime(df["date"])
# 获取年月日
df["year-month-day"] = df["date"].apply(lambda x: x.strftime("%Y-%m-%d"))
# 获取年
df["year"] = df["date"].apply(lambda x: x.strftime("%Y"))
# 获取月
df["month"] = df["date"].apply(lambda x: x.strftime("%m"))
# 获取日
df["day"] = df["date"].apply(lambda x: x.strftime("%d"))
# 获取月日
df["month-day"] = df["date"].apply(lambda x: x.strftime("%Y-%m"))
# 获取周
df['week'] = df['date'].apply(lambda x: x.strftime('%W'))
--加一天
df['data_date'] + pd.Timedelta(days=1)
--减一天
df['data_date'] - pd.Timedelta(days=1)
print(df)
print(df.dtypes)

# 筛选
data = data.loc[(data['物料编码'] == bianma)]

# 计算类
data = data.groupby(["年/月", "物料编码",'商品名称'], axis = 0)["数量(Kg)"].sum().reset_index()    # 分类汇总求和
'''reset_index()可以将分类汇总导致的缩进填充进去'''

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
kukuyu + 1 + 1 刚开始学 谢谢引导
a5228172 + 1 + 1 我很赞同!
CoolKids + 1 大哥的笔录 认真学习

查看全部评分

king100 发表于 2022-3-6 21:09
没有成品和测试Excel吗? 有时候用宏-VBA也很不错
制冷设备 发表于 2022-3-6 21:16
注释很清晰~
Lopht 发表于 2022-3-6 22:05
删除所有print语句,就优化了一大半。试试看就知道。
sxfxtf 发表于 2022-3-6 22:23
确实进阶下用类的方式去写 能优化很多重复调用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表