dlisio について
dlisioは、バイナリ形式のRP66 DLISおよびLIS79を読み込み、構造化配列とメタデータを扱うPythonライブラリです。DLISの書き込みには対応せず、深度の扱いや変換時の情報損失に配慮したスカラー曲線のLAS出力ツールを含みます。
主な機能
- 01DLISとLIS79の読み込み
- 02論理ファイルとフレームの確認
- 03スカラーおよび配列チャンネルの取得
- 04チャンネルのメタデータと次元の保持
- 05スカラー曲線のLAS出力制御
活用シーン
- 01複数論理ファイルを含む検層データの確認
- 02同名チャンネルの読み取り
- 03深度曲線と測定曲線のLAS出力
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill dlisioインストール後、Claude Code で/dlisioを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/dlis_structure.mdframe_channels.mdscripts/dlis_to_las.py詳細
DLIS/LIS の読み取りと制御された LAS エクスポート
バイナリ RP66 DLIS および LIS79 入力には dlisio を使用します。構造化された 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
配列/画像チャンネルは、末尾の次元をすべて保持したまま配列として扱ってください。構造化配列には .items() ではなく dtype.names があります。多次元フィールドを含む場合、DataFrame への直接変換は失敗します。依頼され、文書化された縮約処理がない限り、画像チャンネルを平均してスカラーにしないでください。
深度、欠損値、変換
- インデックスが深度であると判断する前に、
frame.index_typeと最初のチャンネルの単位を確認してください。時間チャンネルやFRAMENOは深度の代わりにはなりません。 - 深度の昇順または降順を維持してください。深度が重複または単調でない場合は、明示的に処理する必要があります。異なるパスを暗黙に並べ替えたり、再サンプリングしたりしないでください。
- DLIS には LAS 形式の汎用的な null センチネルはありません。NaN を保持し、意味が文書化されている場合に限り、ベンダーの null マーカーを適用してください。エクスポート時もマスクを保持してください。
- 識別、検索、個別のロスレス配列エクスポートについては、フレームとチャンネルの処理をお読みください。メタデータ、エンコーディング、個別の LIS API については、ファイル構造と LISをお読みください。
同梱のDLIS-to-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 は、既知のベンダーセンチネルに対するオペレーターの選択を記録します。
検証範囲
複数の論理ファイル/フレーム、重複するニーモニック、スカラー/配列チャンネル、NaN、LAS のラウンドトリップを含む、プロジェクトで生成したバイナリ DLIS を使用して dlisio 1.0.4 で検証しました。これらの合成ファイルはプロジェクト所有であり、現場のログとして再配布されていません。LIS、破損ファイルの復旧、ベンダー固有のレコードには個別のテスト用フィクスチャが必要です。DLIS テストでこれらの処理分岐を検証したと主張しないでください。
DLIS 公式 API、2026-09-14 確認。厳格な解析を使用してください。明示的に記録された復旧判断によって緩和が正当化される場合を除き、解析を緩和しないでください。エラーを、空のエクスポートが成功したかのように報告してはなりません。