从petrel软件导出来的等值线格式不能直接加入Geomap软件,所以需要进行一些数据预处理
做这个事情是想探索一下Geomap4.0的使用方法,毕竟Geomap3.6用了太久,也该换新的了。
遇到的第一个难题就是Geomap4.0需要加载的数据和3.6完全不同,不知道该把数据处理成什么样子。
思索了n长时间后,想出了一个解决方法:就是先建立一个3.6版本的工区,然后拿4.0版本打开,然后再导出成4.0版本的数据,这个数据不就是4.0可以加载的数据了么。我可真牛逼,所以开始动工。
基本流程
1. petrel导出等值线格式为Zmap+
2. 用python的pandas库处理数据***重点***
- 用Pandas读取数据,给四列数据加个名字,x,y,num,z
- 删除z列的重复项
- 将数据按照num分割开 存进一个列表
- 创建一个一行的空值的DataFrame,列名为x,y,num,z
- 把空的DataFrame加到每个分隔开的数据后面
- 将所有数据整合在一起
3. 在geomap4.0加载等值线
一、导出的Zmap+格式和的数据长这样(原数据)
二、Geomap4.0可加载的等值线数据长这样(处理后)
三、用python的pandas库处理数据
1. 读取数据
import pandas as pd
fpath = "petrel_Zmap.txt"
df = pd.read_table(fpath,
sep = '\s+', # 表明输入数据按照空格以及多个空格分列
#delim_whitespace = True,
header = None,
names = ['x', 'y', 'num', 'z'],
engine='python')
2.删除z列重复项
#新增一列 判断以num列分组 z值的重复项
df['bool'] = df.duplicated("num")
#删除“Z”重复项
df.loc[df['bool'], 'z'] = ""
print(df.head(5))
结果为
3.按照num列分隔数据存入列表
#计算循环次数
number = df['num'].max()
#创建列表存放 按照num列分割开的数据
df_split = [a for a in range(number)]
for i in range(number):
df_split[i] = df[df.loc[:, 'num']==i+1]
print(df_split[i])
结果为
4.创建空DataFrame加到上面列表每个元素后
#创建一行空的DataFrame
s = pd.DataFrame({"x":[" "], "y":[" "], "num":[" "], "z":[" "], 'bool':[" "]})
#将空得DataFrame 加到每个 df_split 后面
for i in range(number):
df_split[i] = pd.concat([df_split[i], s], ignore_index = True, sort=False)
print(df_split[i])
结果为
5.合并列表所有数据,删除无用行
#准备一个用于 存放全部split的变量
df_merge = df_split[0].copy()
for i in range(number - 1):
df_merge = pd.concat([df_merge, df_split[i+1]], ignore_index = True, sort = False)
df = df_merge.copy()
del df['num']
del df['bool']
print(df)
结果为:
6.保存成文件
df.to_csv("zmap_to_gm4.txt", sep = '\t', index = False)
四、所有代码汇总
#-*- coding: utf-8 -*-
"""
Created on Mon Jun 21 11:16:01 2021
将petrel中的等值线以Zmap+格式输出,然后导入该程序
会覆盖原文件,可以加载进Geomap4.0
导入等值线即可
@author: gbr
"""
import pandas as pd
import easygui
try:
fpath = easygui.fileopenbox()
df = pd.read_table(fpath,
sep = '\s+', # 表明输入数据按照空格以及多个空格分列
#delim_whitespace = True,
header = None,
names = ['x', 'y', 'num', 'z'],
engine='python')
#计算循环次数
number = df['num'].max()
#新增一列 判断以num列分组 z值的重复项
df'bool'] = df.duplicated("num")
#删除“Z”重复项
df.loc[df['bool'], 'z'] = ""
#创建列表 存放按照num列分割开的数据
df_split = [a for a in range(number)]
for i in range(number):
df_split[i] = df[df.loc[:, 'num']==i+1]
#创建一行空的DataFrame
s = pd.DataFrame({"x":[" "], "y":[" "], "num":[" "], "z":[" "], 'bool':[" "]})
#将空得DataFrame 加到每个 df_split 后面
for i in range(number):
df_split[i] = pd.concat([df_split[i], s], ignore_index = True, sort=False)
#准备一个用于 存放全部split的变量
df_merge = df_split[0].copy()
for i in range(number - 1):
df_merge = pd.concat([df_merge, df_split[i+1]], ignore_index = True, sort = False)
df = df_merge.copy()
del df['num']
del df['bool']
df.to_csv(fpath, sep = '\t', index = False)
except Exception as re:
print("Error")
a= easygui.msgbox(msg = re, title = 'Error', ok_button = "退出")
总的代码里加入了用easygui写得简单的图形界面,方便没有基础的人可以使用,而且加入了报错功能,可以输出错误类型。
由于打包成exe发现执行效率很低,点exe文件运行后好久才能出现图形界面选择来选择文件,所以暂时不知道怎么可以提高运行效率。