测井曲线储量python库lasio解读使用
Lasio是关于las格式测井曲线读写的python库,简介好用。
1、读取LAS文件并显示曲线
pip install lasio即可安装,Lasio读取las文件数据后以numpy的方式存储测井曲线,借助matplotlib显示曲线很方便。
比如通过下面的代码即可读取数据,通过matplotlib可以按照测井数据道显示测井曲线
import numpy as np
from matplotlib import pyplot as plt
import lasio
filePath =R'D:\welllog'
fileName=filePath+"\A10.las"
print(fileName)
las=lasio.read(fileName)
print(type(las.data))
print(las.data.shape)
#以HeadItem的方式显示曲线文件头
las.version
#以CurveItem的方式显示曲线道头
las.curves
#显示曲线道的名称
print(las.keys())
#显示las.data的数据类型
print(type(las.data))
#显示测井数据体的形状
print(las.data.shape)
#显示测井数据道的数据类型
print(type(las[1]))
fig = plt.figure()
trackNum=las.data.shape[1]
for i in np.arange(1,trackNum):
ax = fig.add_subplot(1,trackNum-1,i)
ax.plot(las.data[:,i], las.index)
ax.set_xlabel(las.keys()[i])
ax.xaxis.tick_top()
ax.invert_yaxis()
plt.show()
运行结果如下:
<class 'numpy.ndarray'>
(1835, 6)
['DEPT', 'PERM', 'GAMMA', 'POROSITY', 'FLUVIALFACIES', 'NETGROSS']
<class 'numpy.ndarray'>
(1835, 6)
<class 'numpy.ndarray'>
2、lasio库提供的函数
Lasio提供的函数有这么多,通过这些函数写出las文件,添加曲线道、删除曲线道,可以分辨地进行测井解释工作。
3、通过DataFrame处理测井曲线
把lasio对象转化为pandas的DataFrame可以使用其更多的方法。
df=las.df()
df.head(100) #可以获取100行的数据示例
df.tail(100) #可以获取后100行的数据示例
df.describe() #可以获取每道数据的统计信息,包括数据点个数,均值、方差等。
如果发现某道曲线存在明显的奇异值,可以通过条件化的方法将其赋值为无效值
比如:
df[‘GAMN’][df[‘GAMN’]==-2324.48]=np.nan
可以把’GAMN’曲线道的奇异值-2324.28赋值为无效值np.nan
df.describe()[‘GAMN’] #统计’GAMN’测井曲线道
通过panda的方法pandas.Series.rolling()方法可以很容易地光滑平均得到新的曲线:
df[‘GAMN_avg’]=df[‘GAMN’].rolling(int(1/las.well.STEP.value), center=True).mean()
然后再把DataFrame对象df返回给LASFILE对象,
las.set_data(df)
再次查看las.curves可以发现已经新添加一道曲线。
4、通过laio创建LAS文件
通过抓取数据的方式创建LAS文件
las=lasio.LASFile()
会产生一整套默认参数,直接定义所需的数据,然后通过add_curve的方式添加即可:
depth=np.arange(10,50,0.5)
synth=np.log10(depth)*5+np.random.random(len(depths))
下面的语句可以把曲线添加到LASFile对象并写出到LAS文件。
In [14]: las.add_curve('DEPT', depths, unit='m')
In [15]: las.add_curve('SYNTH',synth, descr='fake data')
In [16]: las.write('build_v2.las', version=2)
In [17]: las.write('build_v1.2.las', version=1.2)
5、lasio的模块组成
lasio包的模块组成
lasio.read(file_ref, **kwargs)
lasio包的7个子模块:
(1)lasio.las module
class lasio.las.LASFile(file_ref=None, **read_kwargs)类型
class lasio.las.Las(file_ref=None, **read_kwargs)类型
class lasio.las.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
(2)lasio.las_items module
class lasio.las_items.HeaderItem(mnemonic='', unit='', value='', descr='', data=None)类型
class lasio.las_items.CurveItem(mnemonic='', unit='', value='', descr='', data=None)类型
class lasio.las_items.SectionItems(*args, **kwargs)
(3)lasio.reader module
lasio.reader.check_for_path_obj(file_ref)
lasio.reader.open_file(file_ref, **encoding_kwargs)
lasio.reader.open_with_codecs(filename, encoding=None, encoding_errors='replace', autodetect_encoding=True, autodetect_encoding_chars=4000)
lasio.reader.adhoc_test_encoding(filename)
lasio.reader.get_encoding(auto, raw)
lasio.reader.read_file_contents(file_obj, regexp_subs, value_null_subs, ignore_data=False)[source]
lasio.reader.read_data_section_iterative(file_obj, regexp_subs, value_null_subs)
lasio.reader.get_substitutions(read_policy, null_policy)
lasio.reader.parse_header_section(sectdict, version, ignore_header_errors=False, mnemonic_case='preserve')
class lasio.reader.SectionParser(title, version=1.2)类型
lasio.reader.read_line(*args, **kwargs)
lasio.reader.read_header_line(line, pattern=None, section_name=None)
(4)lasio.writer module
lasio.writer.write(las, file_object, version=None, wrap=None, STRT=None, STOP=None, STEP=None, fmt='%.5f', column_fmt=None, len_numeric_field=None, data_width=79, header_width=60)
lasio.writer.get_formatter_function(order, left_width=None, middle_width=None)
lasio.writer.get_section_order_function(section, version, order_definitions={1.2: {'Curves': ['value:descr'], 'Parameter': ['value:descr'], 'Version': ['value:descr'], 'Well': ['descr:value', ('value:descr', ['STRT', 'STOP', 'STEP', 'NULL'])]}, 2.0: {'Curves': ['value:descr'], 'Parameter': ['value:descr'], 'Version': ['value:descr'], 'Well': ['value:descr']}})
lasio.writer.get_section_widths(section_name, items, version, order_func)
(5)lasio.excel module
(6)lasio.defaults module
(7)lasio.exceptions module