43  Atmospheric water deficit

Author

Andres Patrignani

Published

May 3, 2024

Keywords

atmospheric water deficit, deficit, drought, stress

In environmental sciences many times we are concerned with soil water deficits that can affect vegetation growth and limit root growth, above ground biomass accumulation, and grain yield. Estimating soil water deficits can be hard, even if we use a model. A more simplistic approach consists of using observations of precipitation and potential evapotranspiration to approximate the state of the soil moisture conditions. Of course, this is just a metric based on atmospheric variables, but both precipitation and potential evapotranspiration are strongly linked to soil moisture dynamics and in some cases might be enough for practical hydrological applications and climate characterization.

# Import modules
import pandas as pd
import matplotlib.pyplot as plt
# Load data for Hollis, OK as in Figure
df = pd.read_csv('../datasets/hollis_ok_precip_et.csv', parse_dates=['date'])
df.head()
date doy precip et
0 1997-02-28 59 0.0 1.57
1 1997-03-01 60 0.0 2.24
2 1997-03-02 61 0.0 2.01
3 1997-03-03 62 0.0 4.34
4 1997-03-04 63 0.0 3.20

The next step consists of computing the cumulative sum of precipitation and evapotranspiration. In this case we will match the window of 15 days used in the reference manuscript by Torres et al., 2013.

We will set a window of 15 days and we will not make any computation for the first 14 values of the time series. This will prevent us from computing extremely low values of atmospheric water deficit due to lack of observations in the window. In other words, the first 15-day rolling sum is computed on day number 15 (first full window with data).

# Compute cumulative precipitation
window = 15 # days
df["precip_cum"] = df["precip"].rolling(window).sum()

# Compute cumulative evapotranspiration
df["et_cum"] = df["et"].rolling(window).sum()
df.head(3)
date doy precip et precip_cum et_cum
0 1997-02-28 59 0.0 1.57 NaN NaN
1 1997-03-01 60 0.0 2.24 NaN NaN
2 1997-03-02 61 0.0 2.01 NaN NaN
# Compute atmospheric water deficit
df["awd"] = df["et_cum"] - df["precip_cum"]
# Compute the day of the year for each date
df["doy"] = df["date"].dt.dayofyear
# We do this to simplify the following statements
grouped_awd = df["awd"].groupby(df["doy"]) # This is an object

# Compute mean
mean_awd = grouped_awd.mean()

# Get groups (which are the unique days of the year)
doy_awd = list(grouped_awd.groups.keys())
# Plot current variables
plt.figure(figsize=(6,5))
plt.title("Hollis, OK", size=12)
plt.plot(doy_awd, mean_awd, '-o')
plt.xlabel('Day of Year', size=12)
plt.ylabel('Atmospheric water deficit (mm)', size=12)
plt.show()

# Calculate probability of AWD > 50 mm
drought_threshold = 50
idx = df["awd"] > drought_threshold
awd_prob_50mm = idx.groupby(df["doy"]).sum() / grouped_awd.size()
# Plot probability chart
plt.figure(figsize=(6,5))
plt.title("Hollis, OK", size=12)
plt.plot(doy_awd, awd_prob_50mm, '-o')
plt.xlabel('Day of Year', size=12)
plt.ylabel('Drought probability', size=12)
plt.show()

References

Torres, G.M., Lollato, R.P. and Ochsner, T.E., 2013. Comparison of drought probability assessments based on atmospheric water deficit and soil water deficit. Agronomy Journal, 105(2), pp.428-436.