mcpField
D
dlisio

dlisio

github.com/steadfastasart数据与数据库7359 次安装6 周前更新
代码仓库

关于 dlisio

dlisio 是用于读取二进制 RP66 DLIS 和 LIS79 数据的 Python 库,可提取结构化数组与元数据,面向测井数据处理。它不写入 DLIS;附带工具可将选定的标量曲线导出为 LAS,并明确处理深度与有损转换问题。

主要功能

  1. 01读取 DLIS 与 LIS79 文件
  2. 02检查逻辑文件和数据帧
  3. 03提取标量及数组通道
  4. 04保留通道元数据与维度
  5. 05受控导出标量曲线为 LAS

适用场景

  1. 01检查多逻辑文件测井数据
  2. 02读取具有重复名称的通道
  3. 03将深度曲线和测量曲线导出为 LAS

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill dlisio

安装后在 Claude Code 中输入/dlisio确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
dlis_structure.md
frame_channels.md
scripts/
dlis_to_las.py

详细介绍

DLIS/LIS 读取与受控 LAS 导出

使用 dlisio 读取二进制 RP66 DLIS 和 LIS79 输入。它会返回结构化 NumPy 数组和元数据对象;它不会写入 DLIS。LAS 使用 lasio。

选择逻辑文件和帧

选择数据前先检查物理文件。逻辑文件和帧可能具有不同的深度、采样率和通道标识。dlis.load() 返回的是 PhysicalFile 上下文管理器,而不是生成器。在上下文中读取数组数据,然后保留复制后的数组或 DataFrame,以便在关闭上下文后继续使用。

from dlisio import dlis

def inventory(path):
    items = []
    with dlis.load(str(path)) as files:
        for logical_index, logical in enumerate(files):
            for frame_index, frame in enumerate(logical.frames):
                items.append({
                    'logical_file': logical_index, 'frame': frame_index,
                    'fingerprint': frame.fingerprint,
                    'index_type': frame.index_type, 'index': frame.index,
                    'channels': [(ch.fingerprint, ch.units, ch.dimension)
                                 for ch in frame.channels],
                })
    return items

通道标识包括类型、助记符、来源和副本编号。仅凭名称不一定唯一。使用 channel.fingerprint 访问其数组字段;即使名称经过消歧,frame.curves() 也会将指纹用作 dtype 标题。 FRAMENO 字段记录帧序号,而不是测量深度。

读取标量和数组通道

from dlisio import dlis
import pandas as pd

def read_frame(path, logical_file_index=0, frame_index=0):
    with dlis.load(str(path)) as files:
        if not 0 <= logical_file_index < len(files):
            raise ValueError('Logical file index out of range')
        logical = files[logical_file_index]
        if not 0 <= frame_index < len(logical.frames):
            raise ValueError('Frame index out of range')
        frame = logical.frames[frame_index]
        records = frame.curves()
        scalar = {name: records[name].copy() for name in records.dtype.names
                  if records[name].ndim == 1}
        arrays = {ch.fingerprint: records[ch.fingerprint].copy()
                  for ch in frame.channels if records[ch.fingerprint].ndim > 1}
        metadata = {'frame': frame.fingerprint, 'index_type': frame.index_type,
                    'index': frame.index,
                    'channels': {ch.fingerprint: {'name': ch.name, 'units': ch.units,
                                 'dimension': ch.dimension} for ch in frame.channels}}
        return pd.DataFrame(scalar), arrays, metadata

将数组/图像通道保留为数组,保留所有尾部维度。结构化数组具有 dtype.names,而不是 .items()。包含多维字段时,直接转换为 DataFrame 会失败。除非有明确要求并记录在案的归约方法,否则不要将图像通道求平均并转换为标量。

深度、缺失值与转换

  • 在将索引声明为深度之前,先检查 frame.index_type 和第一个通道的单位。时间通道或 FRAMENO 不能替代深度。
  • 保留深度递增或递减的顺序。重复/非单调深度需要明确处理;不要悄悄对不同趟次排序或重采样。
  • DLIS 没有通用的 LAS 式空值哨兵。保留 NaN,仅在含义有文档记录时应用厂商空值标记。导出时保留掩码。
    阅读帧和通道处理,了解标识、搜索和单独的无损数组导出。阅读文件结构和 LIS,了解元数据、编码和单独的 LIS API。

随附的 DLIS 到 LAS 辅助工具始终会优先包含经过验证的深度曲线,即使 --curves 只请求测量值。它接受唯一助记符或完整指纹,保留 m/ft 单位和深度顺序,并在采样不规则时写入 STEP=0。默认情况下会排除数组并给出诊断信息;若明确请求数组,则会报错,而不会将其丢弃。LAS 无法无损表示 DLIS 元数据和多维样本。

python scripts/dlis_to_las.py well.dlis --list
python scripts/dlis_to_las.py well.dlis scalar.las --logical-file 0 --frame 0 --curves GR

请相对于此已安装技能目录解析脚本路径。对于非深度索引的帧,必须显式指定 --depth-channel。支持导出的深度单位为 m 和 ft;其他单位需要有文档记录的转换方式。--null-value 用于记录操作者选择的已知厂商哨兵值。

验证范围

已使用 dlisio 1.0.4 和项目生成的二进制 DLIS 文件进行检查,涵盖多个逻辑文件/帧、重复助记符、标量/数组通道、NaN 和 LAS 往返转换。这些合成文件归项目所有,并未重新分发任何现场日志。LIS、损坏文件恢复和厂商专用记录需要各自的测试样本;不要声称 DLIS 测试覆盖了这些分支。

官方 DLIS API,检查日期为 2026-09-14。除非有明确记录的恢复决策足以说明放宽严格解析的合理性,否则请使用严格解析;不得将错误报告为成功但内容为空的导出。

评论

支持 Markdown