2. 密度单位与量纲一致性校验

为什么密度是日报里最容易“串单位”的字段

钻井液密度在日报中常以三种单位出现:g/cm³(现场口语“比重”)、kg/m³(工程计算常用)、ppg(磅/加仑,海外或英文报表常用)。三者数值差异巨大,但物理量相同。若录入时未标注单位或混用,会出现“1.25”与“1250”与“10.4”并存的情况,直接导致后续井筒压力、当量循环密度(ECD)计算失真。本案例的任务是:对一份日报的密度列做单位识别、统一换算到 g/cm³,并标记量纲不一致的记录。

换算基准与判定规则

先固定参照:统一目标单位为 g/cm³。换算关系如下(示例采用工程常用近似值):

  • 1 g/cm³ = 1000 kg/m³
  • 1 g/cm³ ≈ 8.345 ppg(1 ppg ≈ 0.11983 g/cm³)
  • 1 kg/m³ = 0.001 g/cm³

判定逻辑不靠“猜”,而靠数值区间 + 单位标注双重校验:钻井液密度工程合理区间约为 1.0–2.6 g/cm³,对应 1000–2600 kg/m³、8.3–21.7 ppg。若某记录标注单位与数值区间矛盾(如标“g/cm³”却填 1250),或未标单位但数值落在 kg/m³ 区间,即判为量纲不一致。

密度单位换算与量纲一致性校验 记录A 1.25 g/cm³ 记录B 1250 kg/m³ 记录C 10.4 ppg 记录D(异常) 1250 g/cm³ 已是目标单位 ×1 kg/m³ → g/cm³ ÷1000 ppg → g/cm³ ×0.11983 标注与数值矛盾 触发区间校验 统一值:1.25 g/cm³ 状态:一致 ✓ 统一值:1.25 g/cm³ 状态:一致 ✓ 统一值:1.246 g/cm³ 状态:一致 ✓(舍入) 超出 1.0–2.6 区间 状态:量纲不一致 ✗ 待复核 合理区间(g/cm³): 1.0 — 2.6 1250 远超上限 → 判为 kg/m³ 误标或录入错误

用脚本完成批量校验

下面给出一段可直接运行的 Python 示例,对日报密度列逐条识别单位、换算到 g/cm³,并输出不一致标记。示例数据为教学构造,非实测。

import re

# 教学示例:日报密度原始记录(单位标注可能缺失或错误)
records = [
    {"id": "A", "raw": "1.25 g/cm³"},
    {"id": "B", "raw": "1250 kg/m³"},
    {"id": "C", "raw": "10.4 ppg"},
    {"id": "D", "raw": "1250 g/cm³"},   # 标注与数值矛盾
    {"id": "E", "raw": "1.32"},          # 未标单位
]

VALID_MIN, VALID_MAX = 1.0, 2.6   # g/cm³ 合理区间

def parse_density(raw):
    m = re.match(r"([\d.]+)\s*(g/cm³|kg/m³|ppg)?", raw.strip())
    if not m:
        return None, None
    value = float(m.group(1))
    unit = m.group(2)
    return value, unit

def to_gcm3(value, unit):
    if unit == "kg/m³":
        return value / 1000.0
    if unit == "ppg":
        return value * 0.11983
    return value  # g/cm³ 或未标单位

for r in records:
    value, unit = parse_density(r["raw"])
    gcm3 = to_gcm3(value, unit)
    in_range = VALID_MIN <= gcm3 <= VALID_MAX
    # 未标单位但数值落在 kg/m³ 区间,视为疑似 kg/m³
    suspect = (unit is None and 1000 <= value <= 2600)
    flag = "一致" if in_range and not suspect else "量纲不一致"
    print(f'{r["id"]}: {r["raw"]:>12} -> {gcm3:.3f} g/cm³  [{flag}]'
          + ("  疑似kg/m³" if suspect else ""))

预期输出(由给定输入直接推出):A、B、C 判为一致;D 因 1250 g/cm³ 超出区间判为量纲不一致;E 未标单位但数值 1.32 落在 g/cm³ 区间,判为一致,若其实际为 kg/m³ 则需人工确认。

结果判读与处理动作

情形判定处理动作
标注单位与数值区间匹配一致换算后写入统一列,保留原值备查
标注 g/cm³ 但数值在 1000–2600量纲不一致标记待复核,疑似 kg/m³ 误标
未标单位且数值在 1.0–2.6暂判一致按 g/cm³ 处理,提示补标单位
未标单位且数值在 1000–2600疑似 kg/m³按 kg/m³ 换算并标记补标
换算系数 8.345 与 0.11983 互为倒数,实际使用中应固定一套系数并在全表统一,避免同一日报内因舍入方向不同产生 0.001 级偏差累积。
校验通过条件:所有记录换算后均落在 1.0–2.6 g/cm³,且每条记录都有明确单位来源(原始标注或人工确认)。未通过项必须进入复核清单,不得直接参与后续 ECD 计算。