【python后处理】用python对excel数据进行积分,用以得到四种气体产量分数

手动删除非数字行 EXCEL版本

需要预处理,先手动删掉中间出现的非数字行(前三行表头不算)

例如重启了算例的时候会出现下面类似行,需要手动删除
在这里插入图片描述

import openpyxl
import sys
# 创建一个工作簿
wb = openpyxl.Workbook()
# 创建一个test_case的sheet表单
# wb.create_sheet('test_case')
# 保存为一个xlsx格式的文件
# wb.save('cases.xlsx')
# 读取excel中的数据
excelName=sys.argv[1]#外部指定一个文件名
print('load excel:', excelName)
# 第一步:打开工作簿
wb = openpyxl.load_workbook(excelName)
# 第二步:选取表单
sheetName='Sheet1'
sh = wb[sheetName]
print('load sheet:', sheetName)
# 第三步:读取数据
# 参数 row:行  column:列
#ce = sh.cell(row = 3,column = 1)   # 读取第三行,第一列的数据
#print(ce.value)
# 按行读取数据 list(sh.rows)
#print(list(sh.rows)[3:])     
Time=[]
y1=[]
y2=[]
y3=[]
y4=[]
i=0
int_y1=0
int_y2=0
int_y3=0
int_y4=0
for cells in list(sh.rows)[3:]: # 按行读取数据,去掉前三行的表头信息数据
    Time.append(cells[0].value)
    y1.append( cells[1].value)
    y2.append( cells[2].value)
    y3.append( cells[3].value)
    y4.append( cells[4].value)
    #print(Time[i],y1[i],y2[i],y3[i],y4[i])
    #积分
    if i>= 1:
        int_y1+=y1[i]*(Time[i]-Time[i-1])
        int_y2+=y2[i]*(Time[i]-Time[i-1])
        int_y3+=y3[i]*(Time[i]-Time[i-1])
        int_y4+=y4[i]*(Time[i]-Time[i-1])
    i=i+1
print('int_y1=',int_y1)
print('int_y2=',int_y2)
print('int_y3=',int_y3)
print('int_y4=',int_y4)

#归一化
sum_y=int_y1+int_y2+int_y3+int_y4
int_y1_per=int_y1/sum_y*100.0
int_y2_per=int_y2/sum_y*100.0
int_y3_per=int_y3/sum_y*100.0
int_y4_per=int_y4/sum_y*100.0
print('int_y1_per=',int_y1_per,'%')
print('int_y2_per=',int_y2_per,'%')
print('int_y3_per=',int_y3_per,'%')
print('int_y4_per=',int_y4_per,'%')
# 关闭工作薄
wb.close()

== 结果对比==

手动处理excel 结果
在这里插入图片描述

python处理结果
在这里插入图片描述origin积分结果
在这里插入图片描述

手动处理和python完全一致,和origin积分基本一致

自动删除非数字行 CSV版本(推荐)

目前技术比较菜,还不能真正完全做到删除非数字行,只能先去掉所有含#的行,算是曲线救国了。望指点

import pandas as pd
# import numpy as np
import sys
import os
# import re

#读入CSV
CSV_name=sys.argv[1] #外部传入参数
#CSV_name='GAS_YIELD_AVG_ALL.csv'
print('算例位置: ',os.getcwd())
print('CSV name:',CSV_name)
df=pd.read_csv(CSV_name,error_bad_lines=False,header=2)

#重命名列名,去掉多余的# 引号和空格
print('原列名:',df.columns.values)
df.columns=['Time','y1','y2','y3','y4']
# df=df.rename(columns=lambda x: x.replace('#',''))
# df=df.rename(columns=lambda x: x.replace('\"',''))
# df.columns = df.columns.str.strip()
#print(df)
print('新列名:',df.columns.values)

#去掉含有#的行
df=df.astype('str')
df=df[~df.Time.str.contains("#")]

#去掉了#行后保存为CSV
afterCSV='afterProc_'+CSV_name
df.to_csv(afterCSV,index=False)
print('预处理后的CSV文件已保存到',afterCSV)

#转化为数组
df=df.astype('float')
Time=df.iloc[:,0].values
y1=df.iloc[:,1].values
y2=df.iloc[:,2].values
y3=df.iloc[:,3].values
y4=df.iloc[:,4].values

##以下开始进行积分处理
i=0
int_y1=0
int_y2=0
int_y3=0
int_y4=0

for i in range(len(Time)):
    if i>= 1:
        int_y1+=y1[i]*(Time[i]-Time[i-1])
        int_y2+=y2[i]*(Time[i]-Time[i-1])
        int_y3+=y3[i]*(Time[i]-Time[i-1])
        int_y4+=y4[i]*(Time[i]-Time[i-1])
    i=i+1

print('int_y1=',int_y1)
print('int_y2=',int_y2)
print('int_y3=',int_y3)
print('int_y4=',int_y4)

#归一化
sum_y=int_y1+int_y2+int_y3+int_y4
int_y1_per=int_y1/sum_y*100.0
int_y2_per=int_y2/sum_y*100.0
int_y3_per=int_y3/sum_y*100.0
int_y4_per=int_y4/sum_y*100.0
print('int_y1_per=',int_y1_per,'%')
print('int_y2_per=',int_y2_per,'%')
print('int_y3_per=',int_y3_per,'%')
print('int_y4_per=',int_y4_per,'%')

#输出到文件
doc = open('积分后四种气体组分分数.txt','w')
print('算例位置: ',os.getcwd(),file=doc)
print('处理的csv文件: ',CSV_name,file=doc)
print('积分时间区间(s): ',Time[0],' - ',Time[-1],file=doc)
print('列名:',df.columns.values,file=doc)
print(int_y1_per,file=doc)
print(int_y2_per,file=doc)
print(int_y3_per,file=doc)
print(int_y4_per,file=doc)
print('积分结果已经输出到"积分后四种气体组分分数.txt"')
doc.close()

== 结果==
在这里插入图片描述

再对比一组
用脚本处理的
在这里插入图片描述
用origin积分的
在这里插入图片描述

两者完全一致,证明脚本积分是正确的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值