在地震采集中,经常需要障碍物涉及的检波点进行统计,当障碍物分布为不规则的时候,就会出现一条检波点被切割成多段,因此在统计上,也需要进行相应的体现,excel也可以做该类统计,当公式较为繁琐,同时生产的数据需要重新整理,为便于日常工作,就编写了检波点分段区间统计小程序。
首先是把数据读入,其次按照桩号顺序进行排序,最后再进行统计。
from itertools import groupby
import time
import csv
import tkinter as tk
from tkinter import filedialog, dialog
from tkinter.messagebox import *
import pandas as pd
import os
import time
def open_bigspsfile():
filebig_path = filedialog.askopenfilename(title='选择数据文件', filetypes=[('All Files', ['.xlsx','xls'])])
bigpath.set(filebig_path)
def getValueBig():
filebig_path=entry1.get()
return filebig_path
def mat_file():
filebig_path=getValueBig()
filetemp_path=os.path.splitext(filebig_path)[0]
time_start = time.time()
print('读取数据......')
df=pd.read_excel(filebig_path,header=None,dtype='int32') ##int32数据类型,减少内存开销
df.columns=['rline','rpoint']
df['rlinepoint']=df['rline']*10000+df['rpoint']
df=df.sort_values(by = ['rlinepoint'])
df.reset_index(drop=True, inplace=True)
print('数据处理中......')
fun = lambda x: x[1]-x[0]
lst=df['rlinepoint'].values.tolist()
f = open(filetemp_path+'_数据分段统计.csv','w',encoding='utf-8-sig', newline="")
csv_writer = csv.writer(f)
csv_writer.writerow(['线号','范围','数量'])
for k, g in groupby(enumerate(lst), fun):
l1 = [j for i, j in g] # 连续数字的列表
scop = str(min(l1))[-4:] + '-' + str(max(l1))[-4:] # 将连续数字范围用"-"连接
rline=str(min(l1))[0:5]
num=str(len(l1))
csv_writer.writerow([rline, scop, num])
f.close()
time_end=time.time()
timecost = str(round(time_end-time_start,4))
print('耗时 '+timecost+' S')
result = showinfo('提示', '数据处理结束,位于原数据文件夹下')
print(f'提示: {result}')
root = tk.Tk()
root.resizable(0, 0)
root.geometry('500x100+400+100')
root.title('检波点分段区间统计')
bigpath= tk.StringVar()
label1 = tk.Label(root, text=" 1、excel数据位置:")
label1.grid(row=0)
entry1 = tk.Entry(root,width=40,textvariable = bigpath)
entry1.grid(row=0, column=1)
buttonForFile = tk.Button(root, text="浏览文件", command=open_bigspsfile)
buttonForFile.grid(row=0, column=2)
buttonMatch = tk.Button(root, text="2、合并处理", command=mat_file)
buttonMatch.grid(row=1, column=1)
root.mainloop()
软件界面
统计结果