2. 施工压力曲线分段与阶段识别

为什么“分段”不能只看时间轴

施工压力曲线的阶段边界由泵注程序决定,而压力曲线本身只提供间接证据。同一口井在携砂液阶段可能因砂比升高、摩阻增大而压力抬升,也可能因裂缝延伸充分而压力缓降;如果仅按“时间等分”或“压力高低”切分,会把前置液末段误判为携砂液,或把顶替段并入携砂段。因此分段算法必须同时使用两类输入:

  • 泵注程序表:各阶段的设计起止时间、排量、液体类型、砂比,是分段的“先验骨架”。
  • 压力变化率:用滑动窗口计算 dp/dt,识别压力拐点、台阶和斜率突变,用于校正设计时间与实际施工的偏差。

本例采用“设计时间骨架 + 压力变化率校正”的两级分段策略:先按泵注程序给出初始边界,再在边界附近搜索 dp/dt 的显著变化点,将边界吸附到真实拐点上,最后输出各阶段的起止时间与压力区间。

分段判据与边界吸附规则

设采样周期为 Δt,压力序列为 p[i],滑动窗口长度为 W(本例取 15 个采样点)。中心差分变化率:

dpdt[i] = (p[i+W] - p[i-W]) / (2 * W * Δt)   [MPa/min]

边界吸附在初始边界 t0 的邻域 [t0-ΔT, t0+ΔT] 内(本例 ΔT = 3 min)搜索 |dpdt| 的局部极大值点,作为校正后的阶段边界。若邻域内无显著变化(|dpdt| 峰值小于阈值 0.05 MPa/min),则保留设计时间边界。这样既尊重泵注程序,又让边界落在真实压力响应上。

阶段识别还需一个“语义标签”映射:泵注程序中的“前置液/携砂液/顶替液”直接作为阶段名称,压力区间取该阶段内压力的第 5 与第 95 百分位,避免瞬时尖峰拉宽区间。
压力曲线分段:设计骨架 + dp/dt 边界吸附 时间 t (min) 压力 p 0 10 20 30 40 50 60 前置液 携砂液 顶替液 设计边界 t=18 设计边界 t=46 吸附边界 17.2 吸附边界 45.1 dp/dt 拐点 拐点 实测压力 设计边界 吸附边界

可运行的分段实现

下面给出一个不依赖第三方库的 Python 实现。输入为等间隔采样的压力序列、采样周期和泵注程序表;输出为各阶段的起止时间、压力区间与边界校正量。代码可直接运行,末尾附带一组教学示例数据用于验证。

import numpy as np

def smooth_dpdt(p, dt, W=15):
    """中心差分计算压力变化率,单位 MPa/min。"""
    p = np.asarray(p, dtype=float)
    n = len(p)
    dpdt = np.zeros(n)
    for i in range(W, n - W):
        dpdt[i] = (p[i + W] - p[i - W]) / (2 * W * dt)
    dpdt[:W] = dpdt[W]
    dpdt[n - W:] = dpdt[n - W - 1]
    return dpdt

def snap_boundary(dpdt, t0_idx, dt, search_min=3.0, thresh=0.05):
    """在 t0 邻域内搜索 |dpdt| 局部极大值,返回校正后的索引。"""
    half = int(search_min / dt)
    lo = max(1, t0_idx - half)
    hi = min(len(dpdt) - 2, t0_idx + half)
    best_idx, best_val = t0_idx, 0.0
    for i in range(lo, hi + 1):
        if abs(dpdt[i]) >= abs(dpdt[i-1]) and abs(dpdt[i]) >= abs(dpdt[i+1]):
            if abs(dpdt[i]) > best_val:
                best_val = abs(dpdt[i])
                best_idx = i
    return best_idx if best_val >= thresh else t0_idx

def segment_pressure(p, dt, program):
    """
    program: [{'name': '前置液', 't_start': 0, 't_end': 18}, ...]
    返回各阶段起止时间、压力区间、边界校正量。
    """
    dpdt = smooth_dpdt(p, dt)
    n = len(p)
    # 1) 设计边界 -> 索引
    design_idx = [int(round(stage['t_end'] / dt)) for stage in program[:-1]]
    # 2) 边界吸附
    snapped_idx = [snap_boundary(dpdt, idx, dt) for idx in design_idx]
    # 3) 组装阶段
    bounds = [0] + snapped_idx + [n - 1]
    result = []
    for k, stage in enumerate(program):
        i0, i1 = bounds[k], bounds[k + 1]
        seg = p[i0:i1 + 1]
        result.append({
            'name': stage['name'],
            't_start': round(i0 * dt, 2),
            't_end': round(i1 * dt, 2),
            'p_low': round(float(np.percentile(seg, 5)), 2),
            'p_high': round(float(np.percentile(seg, 95)), 2),
            'shift_min': round((i1 - design_idx[k]) * dt, 2) if k < len(design_idx) else 0.0
        })
    return result

# ---- 教学示例数据(示例,非实测)----
dt = 0.1  # min
t = np.arange(0, 60, dt)
# 构造三段压力:前置液陡降、携砂缓降、顶替趋平
p = np.piecewise(t,
    [t < 17.2, (t >= 17.2) & (t < 45.1), t >= 45.1],
    [lambda x: 62 - 0.55 * x,
     lambda x: 52.5 - 0.18 * (x - 17.2),
     lambda x: 47.5 - 0.05 * (x - 45.1)])
p += np.random.default_rng(7).normal(0, 0.15, len(t))  # 示例噪声

program = [
    {'name': '前置液', 't_start': 0,  't_end': 18},
    {'name': '携砂液', 't_start': 18, 't_end': 46},
    {'name': '顶替液', 't_start': 46, 't_end': 58},
]

for s in segment_pressure(p, dt, program):
    print(s)

示例输出(数值随噪声种子略有差异,属于示例预期结果):

{'name': '前置液', 't_start': 0.0,  't_end': 17.2, 'p_low': 52.4, 'p_high': 61.9, 'shift_min': -0.8}
{'name': '携砂液', 't_start': 17.2, 't_end': 45.1, 'p_low': 47.4, 'p_high': 52.5, 'shift_min': -0.9}
{'name': '顶替液', 't_start': 45.1, 't_end': 59.9, 'p_low': 46.7, 'p_high': 47.6, 'shift_min': 0.0}

结果判读与常见偏差

现象可能原因处理方式
边界校正量超过 ±2 min实际泵注与设计程序偏差大,或压力拐点被噪声淹没核对施工记录中的实际排量切换时刻,必要时改用排量信号作为主骨架
携砂段压力区间异常宽砂比阶跃导致摩阻突变,或出现砂堵前兆结合砂比曲线复核,若 dp/dt 持续为正需转入异常诊断
顶替段压力不降反升顶替液黏度高于携砂液,或井筒摩阻增大检查液体类型与排量,确认是否为设计预期
吸附边界落在阶段中部窗口 W 过大,平滑过度减小 W 至 8~10 个采样点,或改用二阶差分
分段结果只是后续诊断的输入,不能替代对泵注程序、砂比、排量等施工记录的核对。若压力曲线出现明显台阶而泵注程序无对应切换,应优先怀疑设备或井筒异常,而非调整分段参数去“拟合”曲线。

快速执行清单

  • 确认采样周期 Δt 与压力单位,统一换算为 MPa/min。
  • 按泵注程序生成初始边界索引,记录设计起止时间。
  • 计算 dp/dt,窗口 W 取 10~15 个采样点,检查曲线是否平滑且保留拐点。
  • 在 ±3 min 邻域内吸附边界,记录每个边界的校正量。
  • 输出各阶段起止时间、压力第 5/95 百分位区间,与施工记录逐项核对。
  • 校正量超过 ±2 min 或压力区间异常时,转入异常诊断流程。