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³ 区间,即判为量纲不一致。
用脚本完成批量校验
下面给出一段可直接运行的 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 计算。