【python后处理】用python对excel数据进行积分,用以得到四种气体产量分数
程序员文章站
2022-07-08 15:43:48
无异常版本需要预处理,先手动删掉中间出现的非数字行(前三行表头不算)这里说的“异常”是中间的非数字行例如重启了算例的时候会出现下面类似行,需要手动删除import openpyxl# 创建一个工作簿wb = openpyxl.Workbook()# 创建一个test_case的sheet表单# wb.create_sheet('test_case')# 保存为一个xlsx格式的文件# wb.save('cases.xlsx')# 读取excel中的数据# 第一步:打开工作簿wb...
手动删除非数字行 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()
== 结果==
本文地址:https://blog.csdn.net/weixin_43940314/article/details/112604018
上一篇: PHP怎样获取字符流中第一个不重复字符