Skip to content

Your own field data

A typical field sheet: depth to water in metres below ground at irregular minutes, a rate in litres per minute read off a flow meter, and an observation well some metres away. This page turns that into a test.

From a CSV

Suppose field.csv holds minutes,depth_m with the static level as the first row. Here the file is written first so the example runs:

from pathlib import Path

Path("field.csv").write_text(
    "minutes,depth_m\n0,8.42\n1,8.61\n2,8.70\n4,8.81\n8,8.93\n15,9.03\n30,9.15\n"
    "60,9.27\n120,9.38\n240,9.50\n480,9.61\n"
)
import numpy as np

from pumptest import Observation, PumpingTest, Schedule, Theis, Well, fit
from pumptest.units import convert, drawdown_from_levels

raw = np.loadtxt("field.csv", delimiter=",", skiprows=1)
static = raw[0, 1]
minutes, depth = raw[1:, 0], raw[1:, 1]

test = PumpingTest(
    well=Well(radius=0.075),  # a 150 mm borewell
    schedule=Schedule.constant(float(convert(600, "lpm", "m3/d"))),
    observations=[
        Observation(
            "OW-1",
            distance=15.0,
            time=convert(minutes, "min", "d"),
            drawdown=drawdown_from_levels(depth, static),
        )
    ],
    thickness=30.0,
)
print(fit(test, Theis()).summary())

A rate that changed

If the pumping rate changed during the test, enter each change as a step in the schedule and the solution superposes them.

schedule = Schedule(((0.0, 864.0), (0.05, 820.0), (0.2, 790.0)))
varying = PumpingTest(test.well, schedule, test.observations, thickness=30.0)
print(fit(varying, Theis()).values)

Checklist before you trust a fit

  • Time zero is the moment pumping started, not the first reading.
  • Drawdown is positive and measured from the static level before pumping.
  • Units are one consistent set; the result is in that set.
  • Look at the derivative before choosing a model (Choosing the model).
  • Look at the residuals (result.residuals) after fitting: a pattern in them means the model is missing something.