Area Average#

Regional Cosine-Weighted Mean#

This section demonstrates how to compute a cosine-latitude-weighted average over a specified lat-lon region. This method accounts for the varying grid cell areas with latitude, ensuring an accurate spatial average.


📌 Function: regional_weighted_mean()#

def regional_weighted_mean(data, lat1, lat2, lon1, lon2):
    """
    Compute cosine-latitude-weighted regional mean over the specified lat-lon bounds.

    Parameters
    ----------
    data : xarray.DataArray
        Input data with dimensions (time, lat, lon).
    lat1, lat2 : float
        Latitude bounds.
    lon1, lon2 : float
        Longitude bounds (either in -180 to 180 or 0 to 360).

    Returns
    -------
    dat_region_mean : xarray.DataArray
        Regional mean time series (time).
    """
    # --- Longitude adjustment ---
    target_lon_range = 'neg180_180' if lon1 < 0 or lon2 < 0 else '0_360'
    if target_lon_range == 'neg180_180' and (data.lon > 180).any():
        data = data.assign_coords(lon=((data.lon + 180) % 360 - 180)).sortby('lon')
    elif target_lon_range == '0_360' and (data.lon < 0).any():
        data = data.assign_coords(lon=(data.lon % 360)).sortby('lon')

    # --- Select region ---
    dat_region = data.sel(lat=slice(lat1, lat2), lon=slice(lon1, lon2))

    # --- Apply cosine-latitude weighting ---
    weights = np.cos(np.deg2rad(dat_region['lat']))
    dat_region_mean = dat_region.weighted(weights).mean(dim=['lat', 'lon'], skipna=True)

    # --- Assign name ---
    dat_region_mean.name = f"regional_mean_{lat1}_{lat2}_{lon1}_{lon2}"

    return dat_region_mean

📌 Example: Niño 3.4 Index Calculation#

# --- Calculate Niño 3.4 index from NDJFM seasonal data ---
nino34_ts = regional_weighted_mean(dat_NDJFM, -5, 5, 190, 240)

# --- Calculate standard deviation over the available years ---
nino34_std = nino34_ts.std(dim="year", skipna=True)

# --- Standardize the time series ---
nino34_ts_std = nino34_ts / nino34_std

# --- Update attributes ---
nino34_ts_std.attrs = nino34_ts.attrs.copy()
nino34_ts_std.attrs['note1'] = f"Standardized Niño 3.4 index. Standard deviation: {nino34_std.values:.3f}"

print(nino34_ts_std)

This process extracts a regional index (e.g., Niño 3.4 SST anomaly) and standardizes it to allow comparisons across time or with other variables.