使用LASIO合并LAS文件为DataFrame时索引不匹配的插值方案
解决方案:对齐深度索引后插值合并LAS文件
针对LAS文件深度索引不匹配导致合并失败的问题,核心思路是先统一所有井的深度索引,再通过插值补全缺失值,具体实现步骤如下:
步骤1:提取全局深度范围,生成公共索引
先收集所有LAS文件的深度数据,确定全局最小/最大深度,再生成连续的公共深度序列(可根据需求选择步长,比如保留原文件的最小步长,或手动指定固定步长)。
步骤2:单井数据插值对齐到公共索引
将每个井的DataFrame重采样到公共深度索引,用线性插值补全缺失的深度点(测井数据小范围差异用线性插值不影响可靠性)。
步骤3:合并对齐后的DataFrame
所有井的数据对齐到同一索引后,直接按列合并即可。
修改后的完整代码
import tkinter as tk from tkinter import filedialog import lasio import pandas as pd def selectFiles(): root = tk.Tk() root.wm_attributes('-topmost', 1) filename = filedialog.askopenfilenames() root.withdraw() return filename las_files_list = selectFiles() df_list = [] well_names = [] # 读取所有LAS文件,收集原始数据与井名 for f in las_files_list: las = lasio.read(f) lasdf = las.df() well_name = str(las.well.WELL.value) well_names.append(well_name) df_list.append(lasdf) # 生成公共深度索引:覆盖所有井的深度范围,用最小步长生成连续序列 all_depths = [] step_sizes = [] for df in df_list: all_depths.extend(df.index.tolist()) # 计算当前井的深度步长 steps = df.index[1:] - df.index[:-1] step_sizes.extend(steps.tolist()) min_depth = min(all_depths) max_depth = max(all_depths) common_step = min(step_sizes) # 取所有井的最小步长,也可手动指定如0.1 # 生成连续的公共深度索引 common_depths = pd.arange(min_depth, max_depth + common_step, common_step) common_depths = pd.Index(common_depths, name='DEPT') # 对每个井的数据插值对齐到公共索引 aligned_dfs = [] for idx, df in enumerate(df_list): # 重采样到公共索引,线性插值补全缺失值 aligned_df = df.reindex(common_depths) aligned_df = aligned_df.interpolate(method='linear', limit_direction='both') # 给列名添加井名后缀,方便识别来源 aligned_df = aligned_df.add_suffix(f'_{well_names[idx]}') aligned_dfs.append(aligned_df) # 合并所有对齐后的DataFrame wdf = pd.concat(aligned_dfs, axis=1) # 可选:将索引转为DEPT列 wdf['DEPT'] = wdf.index
关键细节说明
- 公共索引生成:用所有井的深度范围和最小步长生成连续序列,确保覆盖所有井的数据;若不需要连续序列,也可提取所有唯一深度并排序后作为公共索引。
- 插值策略:
linear线性插值适配测井数据的小范围差异,limit_direction='both'确保首尾缺失值也能被补全。 - 列名标识:用井名作为列后缀,比原代码的数字后缀更直观,便于后续数据溯源。
内容的提问来源于stack exchange,提问作者Cyril Ezhov
相关产品推荐
相关产品推荐

