|
10鱼币
不知为何,所发文字含有不良信息,故将需求写进附件中
图片:
附件:
需求与数据.zip
(75.56 KB, 下载次数: 4)
- import pandas as pd
- import openpyxl
- file = r"C:\Users\me\Desktop\zwyc.xlsx"
- wb_w =openpyxl.load_workbook(file)
- sheet = wb_w['对齐大表']
- zm = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- zm.extend([m+n for m in zm for n in zm]) #生成与excel表格一致的表头
- df = pd.read_excel(file,sheet_name='对齐大表',header=None)
- row_max = df.shape[0]
- col_max = df.shape[1]
- df.columns = zm[:col_max]
- df.index = df.index+1
- qx = '环焊缝异常' # excel对应的列
- col_hhfh = 'U'
- col_hfjl = 'V'
- col_xygc = 'W'
- col_jclc = 'X'
- col_tzlb = 'Y'
- col_sbqx = 'Z'
- col_fh = 'AI'
- col_bz = 'AJ'
- for row in df.index:
- if df.loc[row][col_tzlb] == qx:
- print(row)
- for up in range(row-1,0,-1):
- if df.loc[up][col_tzlb] == '环焊缝':
- row_up = up
- print(row_up)
- break
- for under in range(row+1,row_max+1,1):
- if df.loc[under][col_tzlb] == '环焊缝':
- row_under = under
- print(row_under)
- break
- dist_up = abs(df.loc[row][col_jclc] - df.loc[row_up][col_jclc])
- dist_under = abs(df.loc[row][col_jclc] - df.loc[row_under][col_jclc])
- if dist_under < dist_up:
- sheet.insert_rows(row_under + 1) # 插入空行。参数(x,y)x插入的位置,从1开始;y插入的行数
- temp = col_hhfh + str(row) + ":" + col_bz + str(row) # 拼接移动的区域Excel,例:"A3:J3"
- sheet.move_range(temp,row_under + 1 - row,0) # 移动数据。(x,y,z)x移动的区域str类型,y移动行数的相对量,移动列数的相对量
- sheet.delete_rows(row) # 删除数据移动后的空行
- wb_w.save(file)
复制代码
水平有限,其实逻辑很简单,但是中间和pandas的各种操作斗争了很久,代码写的也比较乱,随便看看,主要是逻辑,具体的你可以自己实现
简单说一下逻辑,当下一次 环焊缝出现时,这次环焊缝到上次环焊缝之间的数据的位置就已经确定了,上次环焊缝后面放的是两次环焊缝之间的所有异常数据里离上次环焊缝距离近的数据(也就是位置在中点偏向上次环焊缝一侧的哪些数据),然后是不是环焊缝异常的数据,然后是这次环焊缝数据,然后是剩下的环焊缝异常数据。说的比较绕,你多看几次。
代码如下
- import pandas as pd
- def processing(excel_file,output):
- #读取文件并重设表头
- df = pd.read_excel(excel_file,header=None) #不读取表头
- df.columns=[i for i in range(36)]
- df2=pd.DataFrame(columns = [i for i in range(36)]) #重新设置表头(检测里程为23列,特征类别为24列)
- cur_girth_weld = 2 #存放上一个环焊缝数据的行数
- mid=0 #存放当前环焊缝和上一个环焊缝里程数的中值
- error_cache=[] #存放上一个环焊缝到当前环焊缝中环焊缝异常的行数
- cache=[] #存放上一个环焊缝到当前环焊缝中不是环焊缝为异常的行数
- df2 = df2.append(df.iloc[2],ignore_index=False, verify_integrity=False, sort=None)
- for row in df.index[2:]:
-
- if df.loc[row,24]=="环焊缝": #读取到环焊缝,开始处理保存下来的数据
- mid=(df.loc[row,23]+df.loc[cur_girth_weld,23])/2 #求两个环焊缝中点
- while error_cache:
- if df.iloc[error_cache[0],23]<mid: #小于重点,则直接放在上一个环焊缝后
- df2 = df2.append(df.iloc[error_cache[0]],ignore_index=False, verify_integrity=False, sort=None)
- error_cache.pop(0)
- else:
- break # 因为数据已经排序,所以当大于中点,跳出
-
- for row_c in cache: #存放非行环焊缝异常数据
- df2 = df2.append(df.iloc[row_c],ignore_index=False, verify_integrity=False, sort=None)
- cache=[]
- df2 = df2.append(df.iloc[row],ignore_index=False, verify_integrity=False, sort=None) #存放当前环焊缝数据
- cur_girth_weld=row
-
- while error_cache: #存放剩下的环焊缝异常数据
- df2 = df2.append(df.iloc[error_cache[0]],ignore_index=False, verify_integrity=False, sort=None)
- error_cache.pop(0)
- elif df.loc[row,24]=="环焊缝异常":
- error_cache.append(row) #缓存环焊缝异常数据
- else:
- cache.append(row) #缓存非环焊缝异常数据
- df2.to_excel(output)
- if __name__=="__main__":
- processing("zwyc.xlsx","output.xlsx")
-
-
复制代码
|
最佳答案
查看完整内容
水平有限,其实逻辑很简单,但是中间和pandas的各种操作斗争了很久,代码写的也比较乱,随便看看,主要是逻辑,具体的你可以自己实现
简单说一下逻辑,当下一次 环焊缝出现时,这次环焊缝到上次环焊缝之间的数据的位置就已经确定了,上次环焊缝后面放的是两次环焊缝之间的所有异常数据里离上次环焊缝距离近的数据(也就是位置在中点偏向上次环焊缝一侧的哪些数据),然后是不是环焊缝异常的数据,然后是这次环焊缝数据,然后是剩 ...
|