Presiones a un Mismo Datum: Corrección Hidrostática en Python

Comparar dos pozos después de eliminar el efecto de la elevación

Yacimientos
Python
Calcula la densidad del aceite con PVT, convierte profundidades a una referencia común y corrige presiones a un datum. Ejemplo paso a paso en Python con comparación gráfica de dos pozos.
Autor/a
Fecha de publicación

3 de octubre de 2026

¿Por qué necesitamos una presión al datum?

Dos pozos pueden registrar presiones diferentes simplemente porque las mediciones corresponden a distintas elevaciones. Antes de comparar sus presiones, debemos llevarlas a un mismo plano de referencia o datum, utilizando el gradiente del fluido.

Desarrollaremos el ejemplo 3.2 de Fundamental Principles of Reservoir Engineering, de Brian F. Towler: dos pozos con el mismo aceite y distintas elevaciones de KB. El procedimiento será cargar los datos, calcular la densidad del aceite, convertir la profundidad a una referencia común y corregir la presión.

La comparación es válida para presiones representativas del yacimiento, medidas bajo condiciones estáticas comparables y en fechas compatibles. No debemos mezclar directamente presiones fluyentes, de cabeza y de fondo.

Visita el canal @rigopetrodata

Tutoriales de R, Python y Excel para ingeniería petrolera

Ver canal

1. Cargar los datos y definir la referencia vertical

Descargar el dataset de los dos pozos. Guarda el CSV junto al notebook. Utilizaremos pandas, NumPy y Matplotlib: pip install pandas numpy matplotlib.

Ver código
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

pozos = pd.read_csv("presiones_pozos.csv")
pozos
Pozo KB_ft_MSL TVD_KB_ft p_psia
0 Pozo 1 7134 5652 2453
1 Pozo 2 7028 5426 2306
Columna Significado
KB_ft_MSL Elevación del kelly bushing sobre el nivel medio del mar, en ft.
TVD_KB_ft Distancia vertical desde KB hasta el punto de medición, positiva hacia abajo, en ft.
p_psia Presión absoluta en el punto de medición, en psia.

El libro proporciona profundidad desde KB; para la corrección hidrostática la interpretamos como profundidad vertical. Si nuestros datos son profundidad medida a lo largo del pozo (MD), primero debemos obtener la TVD usando la trayectoria. MD y TVD no son intercambiables en un pozo desviado.

Usaremos la elevación \(z\) respecto al nivel del mar, positiva hacia arriba:

\[z=\mathrm{KB}_{MSL}-\mathrm{TVD}_{KB}\]

Ver código
pozos["z_ft_MSL"] = pozos.KB_ft_MSL - pozos.TVD_KB_ft
pozos[["Pozo", "z_ft_MSL", "p_psia"]]
Pozo z_ft_MSL p_psia
0 Pozo 1 1482 2453
1 Pozo 2 1602 2306

Los puntos de medición quedan en 1482 y 1602 ft sobre el nivel del mar. El pozo 2 está 120 ft más alto, aunque las profundidades desde sus respectivos KB difieren 226 ft. Esa diferencia de 226 ft no es la separación vertical entre las mediciones.

Que ambos puntos estén sobre el nivel del mar no significa que estén cerca de la superficie: las elevaciones de KB son superiores a 7000 ft.

2. Calcular la densidad del aceite en el yacimiento

Los datos del fluido del ejemplo son:

Propiedad Valor
Gravedad API del aceite de tanque 32 °API
Gravedad específica del gas, aire = 1 0.72
Rs 500 scf/STB
Bo 1.30 bbl/STB
Temperatura de yacimiento 200 °F

La densidad del aceite vivo incluye la masa de aceite de tanque y la del gas disuelto. Siguiendo la formulación del capítulo 3:

\[\rho_{o,sc}=\frac{141.5}{131.5+API}\rho_{w,sc}\]

\[\rho_{g,sc}=\frac{\gamma_g M_{aire}p_{sc}}{R T_{sc}}\]

\[\rho_{o,R}=\frac{\rho_{o,sc}+\rho_{g,sc}R_s/5.61458}{B_o}\]

El factor 5.61458 ft³/bbl permite combinar las unidades de Rs con las densidades en lbm/ft³. La densidad del gas en esta ecuación se calcula a condiciones estándar, no a los 200 °F del yacimiento. El efecto de las condiciones de yacimiento ya está representado en los datos PVT de Bo y Rs suministrados.

Ver código
API = 32
sg_gas = 0.72
Rs = 500
Bo = 1.30

rho_aceite_sc = 141.5 / (131.5 + API) * 62.366
rho_gas_sc = sg_gas * 28.97 * 14.73 / (10.73 * 519.6)
rho_aceite = (rho_aceite_sc + rho_gas_sc * Rs / 5.61458) / Bo
gradiente = rho_aceite / 144

print(f"Densidad del aceite: {rho_aceite:.2f} lbm/ft³")
print(f"Gradiente: {gradiente:.4f} psi/ft")
Densidad del aceite: 45.29 lbm/ft³
Gradiente: 0.3145 psi/ft

Obtenemos aproximadamente 45.29 lbm/ft³ y 0.3145 psi/ft. La relación \(G=\rho/144\) corresponde a unidades de campo y gravedad estándar, incluyendo la conversión entre masa y fuerza. No debemos aplicar esa división a una densidad expresada en kg/m³.

Aquí tratamos el gradiente como constante en los 120 ft que separan las mediciones. Para columnas de gas o variaciones importantes de densidad, hay que integrar la relación hidrostática con las propiedades apropiadas.

3. Llevar las presiones al mismo datum

Con elevación positiva hacia arriba, la ecuación es:

\[p_d=p_m+G(z_m-z_d)\]

Donde \(p_m\) es la presión medida, \(z_m\) su elevación y \(z_d\) la elevación del datum. Elegimos 1482 ft MSL, el nivel del punto de medición del pozo 1.

  • Si el datum está más abajo, \(z_m-z_d>0\): sumamos presión.
  • Si el datum está más arriba, \(z_m-z_d<0\): restamos presión.
  • Si coincide con el punto de medición, la corrección es cero.
Ver código
z_datum = 1482

pozos["delta_z_ft"] = pozos.z_ft_MSL - z_datum
pozos["correccion_psi"] = gradiente * pozos.delta_z_ft
pozos["p_datum_psia"] = pozos.p_psia + pozos.correccion_psi

pozos[["Pozo", "z_ft_MSL", "delta_z_ft", "p_psia",
       "correccion_psi", "p_datum_psia"]].round(2)
Pozo z_ft_MSL delta_z_ft p_psia correccion_psi p_datum_psia
0 Pozo 1 1482 0 2453 0.00 2453.00
1 Pozo 2 1602 120 2306 37.74 2343.74

El pozo 1 conserva 2453 psia. Para el pozo 2, sumamos aproximadamente 37.74 psi, por lo que su presión al datum es 2343.74 psia. La diferencia entre pozos pasa de 147 psi medidos a aproximadamente 109.26 psi al mismo nivel.

Si prefieres trabajar con profundidad respecto al nivel del mar, positiva hacia abajo, define \(d=-z\) y utiliza \(p_d=p_m+G(d_d-d_m)\). Ambas formas son equivalentes; lo importante es mantener una sola convención de signos.

🛒
Propiedades De Los Fluidos Del Yacimiento

Disponible en Mercado Libre

Ver oferta →

4. Comparar presiones medidas y corregidas

Ver código
pozos.set_index("Pozo")[["p_psia", "p_datum_psia"]].plot.bar(
    rot=0, figsize=(7, 4)
)
plt.ylabel("Presión (psia)")
plt.xlabel("Pozo")
plt.legend(["Medida", "Al datum"])
plt.tight_layout()
plt.show()
Figura 1: Presiones medidas y corregidas al datum de 1482 ft MSL. El pozo 1 ya se encuentra en ese nivel.

La corrección reduce la diferencia, pero no la elimina. Comparar las presiones originales habría atribuido a los pozos una separación mayor de la que corresponde al llevarlos al mismo plano.

5. Ver la corrección en un gráfico presión–elevación

En este gráfico, cada segmento lleva una medición hasta el datum siguiendo el gradiente del aceite. La elevación aumenta hacia arriba, igual que nuestra convención matemática.

Ver código
for v in pozos.itertuples():
    plt.plot([v.p_psia, v.p_datum_psia],
             [v.z_ft_MSL, z_datum], "o-", label=v.Pozo)
plt.axhline(z_datum, color="gray", linestyle="--", label="Datum")
plt.xlabel("Presión (psia)")
plt.ylabel("Elevación sobre el nivel del mar (ft)")
plt.legend()
plt.show()
Figura 2: Proyección hidrostática de cada presión al mismo plano. Los puntos al datum conservan una diferencia cercana a 109 psi.

El pozo 1 aparece como un punto porque su corrección es cero. El segmento del pozo 2 se desplaza hacia una presión mayor al bajar desde 1602 hasta 1482 ft MSL.

6. ¿Cuánto influye el gradiente que elegimos?

Podemos repetir la corrección para un rango de gradientes. Usaremos 0.28 a 0.35 psi/ft como sensibilidad ilustrativa, no como un intervalo de incertidumbre medido ni como un rango universal para aceites.

Ver código
gradientes = np.linspace(0.28, 0.35, 50)
p1, p2 = pozos.p_psia
z1, z2 = pozos.z_ft_MSL

diferencia = (p1 + gradientes*(z1-z_datum)) - (
    p2 + gradientes*(z2-z_datum)
)
plt.plot(gradientes, diferencia)
plt.axvline(gradiente, color="gray", linestyle="--", label="Gradiente PVT")
plt.xlabel("Gradiente del aceite (psi/ft)")
plt.ylabel("Diferencia P1 − P2 al datum (psi)")
plt.legend()
plt.show()
Figura 3: Sensibilidad de la diferencia de presión al gradiente común elegido. La línea vertical indica el gradiente calculado con PVT.

En ese intervalo la diferencia corregida varía entre 113.4 y 105 psi. Por tanto, estas variaciones del gradiente no eliminan la separación entre las presiones. Para anularla solo con una corrección común se requeriría \(147/120=1.225\) psi/ft, muy alejado del gradiente del aceite calculado.

7. Comprobar el cálculo

Dos verificaciones sencillas son regresar del datum a la presión medida y repetir la comparación usando otro datum. Si ambos pozos comparten el mismo gradiente constante, la diferencia corregida no depende del datum elegido.

Ver código
p_reconstruida = pozos.p_datum_psia - gradiente*pozos.delta_z_ft
assert np.allclose(p_reconstruida, pozos.p_psia)

p_otro_datum = pozos.p_psia + gradiente*(pozos.z_ft_MSL - 1500)
diferencia_actual = pozos.p_datum_psia.iloc[0] - pozos.p_datum_psia.iloc[1]
diferencia_otro = p_otro_datum.iloc[0] - p_otro_datum.iloc[1]
assert np.isclose(diferencia_actual, diferencia_otro)

print(f"Diferencia al datum: {diferencia_actual:.2f} psi")
Diferencia al datum: 109.26 psi

¿Qué nos dice la diferencia restante?

Las presiones corregidas no coinciden bajo el modelo de un mismo aceite en equilibrio hidrostático. Esto merece investigar comunicación entre zonas, diferencias de agotamiento, fechas de medición, estabilización de las pruebas y calidad de las presiones.

La diferencia de presión por sí sola no demuestra una barrera ni permite asignar compartimentos de manera definitiva. Pozos comunicados también pueden presentar diferencias si existe flujo o si no han alcanzado equilibrio. La interpretación debe apoyarse en la incertidumbre de las mediciones, la historia operativa y evidencia geológica o de pruebas de presión.

Para aplicar el procedimiento a otros pozos debemos conservar una referencia vertical común, usar TVD hasta el punto donde corresponde la presión y elegir el gradiente del fluido correcto. Si la trayectoria vertical de corrección cruza un contacto entre fluidos, la contribución hidrostática se calcula por tramos.

Referencia

Towler, B. F. (2002). Fundamental Principles of Reservoir Engineering. SPE Textbook Series, volumen 8. Capítulo 3, Reservoir Statics, secciones 3.2–3.5, páginas impresas 33–35; ecuaciones 3.1 y 3.4, tabla 3.1 y ejemplo 3.2. La sensibilidad al gradiente y las gráficas son extensiones didácticas del ejemplo.