1.5.1. Satellite Soil Moisture Data for Drought Detection in Europe#
Production date: 16-June-2024
Produced by: Amaya Camila Trigoso Barrientos (VUB)
🌍 Use case: Drought detection and monitoring on a regional level#
❓ Quality assessment question(s)#
Can satellite soil moisture data be used to detect the historically reported drought of 2023 in Europe?
Accurate soil moisture data is critical for monitoring droughts. The Copernicus Climate Change Service (C3S) provides the Combined Surface Soil Moisture (C3S-SM-COMBINED) product, which integrates active and passive microwave satellite observations to estimate surface (top few centimeters) soil moisture at a high temporal resolution (ICDR updated on a 10-day cycle). This study evaluates the usability of this dataset for tracking drought evolution across Europe in the warm season of 2023. The analysis focuses on dekadal anomalies of surface soil moisture (SSMA) from April to July 2023, highlighting regional differences, data coverage, and consistency with reported drought conditions.
📢 Quality assessment statement#
These are the key outcomes of this assessment
The C3S surface soil moisture product is a valuable Essential Climate Variable (ECV) for tracking agricultural drought, especially when used alongside complementary indicators like root zone soil moisture, precipitation anomalies, and vegetation indices.
The COMBINED product successfully captures the intense drought in the Iberian Peninsula during spring 2023, consistent with observed heatwaves and low rainfall.
Coverage in Scandinavia and the Nordic region is still limited in spring due to snow, highlighting a known limitation of satellite-based soil moisture retrieval under frozen or snow-covered conditions.
📋 Methodology#
The analysis and results are organized in the following steps, which are detailed in the sections below:
Download the combined passive and active satellite soil moisture data from 1991 to 2023. Select the volumetric_surface_soil_moisture variable and choose the 10-day average as the time aggregation option.
2. Calculate Surface Soil Moisture Anomaly
Extract soil moisture data in Europe.
Calculate the dekad mean and standard deviation for the long-term period 1991 to 2020.
Extract 2023 data into a separate set.
Calculate the SSMA for 2023 in relation to the long-term period data.
Map the SSMA in Europe for Spring-Mid Summer 2023.
Plot the mean SSMA over time for specific regions.
Analyze the results.
📈 Analysis and results#
1. Request and download data#
Import packages#
Show code cell source
import xarray as xr
import numpy as np
import fsspec
import os
import geopandas
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import matplotlib.colors as mcolors
import matplotlib.gridspec as gridspec
import shapely.geometry
from shapely.geometry import Point
from shapely.geometry import MultiPolygon
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from c3s_eqc_automatic_quality_control import download
from matplotlib import animation, pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib import path
import matplotlib.dates as mdates
import rioxarray as rxr
import requests
import zipfile
os.environ["CDSAPI_RC"] = os.path.expanduser("~/trigoso_camila/.cdsapirc")
plt.style.use("seaborn-v0_8-notebook")
Set variables#
Show code cell source
shapefile_url = "https://figshare.com/ndownloader/files/23392280"
Set the data request#
Show code cell source
collection_id = "satellite-soil-moisture"
request = {
"variable": ["volumetric_surface_soil_moisture"],
"type_of_sensor": ["combined_passive_and_active"],
"time_aggregation": ["10_day_average"],
"year": [
"1991", "1992", "1993",
"1994", "1995", "1996",
"1997", "1998", "1999",
"2000", "2001", "2002",
"2003", "2004", "2005",
"2006", "2007", "2008",
"2009", "2010", "2011",
"2012", "2013", "2014",
"2015", "2016", "2017",
"2018", "2019", "2020",
"2021", "2022", "2023"
],
"month": [
"01", "02", "03",
"04", "05", "06",
"07", "08", "09",
"10", "11", "12"
],
"day": ["01", "11", "21"],
"type_of_record": ["cdr"],
"version": ["v202312"]
}
Download data#
Show code cell source
# Dataset
ds = download.download_and_transform(
collection_id,
request,
chunks={"year": 1},
transform_chunks=False,
)
# Shapefile
with fsspec.open(f"simplecache::{shapefile_url}") as file:
world_shape = geopandas.read_file(file)
Show code cell output
0%| | 0/33 [00:00<?, ?it/s]2025-05-30 13:58:16,664 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:58:16,859 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:58:17,533 INFO Request ID is 967eb086-6518-4236-90a7-8d566f97c596
2025-05-30 13:58:17,577 INFO status has been updated to accepted
2025-05-30 13:58:52,919 INFO status has been updated to running
2025-05-30 13:59:10,025 INFO status has been updated to successful
86ae92af8d0f26fa9731dcfbdac52901.zip: 0%| | 0.00/23.6M [00:00<?, ?B/s]
86ae92af8d0f26fa9731dcfbdac52901.zip: 17%|█▋ | 4.00M/23.6M [00:00<00:00, 39.8MB/s]
86ae92af8d0f26fa9731dcfbdac52901.zip: 59%|█████▉ | 14.0M/23.6M [00:00<00:00, 74.1MB/s]
0%| | 0/36 [00:00<?, ?it/s]
3%|▎ | 1/33 [00:55<29:40, 55.63s/it]2025-05-30 13:59:12,509 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:59:12,529 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 13:59:12,878 INFO Request ID is 1d5a35a7-8be6-4175-ab7a-8c6276ec5db7
2025-05-30 13:59:12,966 INFO status has been updated to accepted
2025-05-30 14:00:03,061 INFO status has been updated to running
2025-05-30 14:00:28,770 INFO status has been updated to successful
9cb84068c0190fade02b3b9d5387ecfc.zip: 0%| | 0.00/26.0M [00:00<?, ?B/s]
9cb84068c0190fade02b3b9d5387ecfc.zip: 15%|█▌ | 4.00M/26.0M [00:00<00:00, 41.1MB/s]
9cb84068c0190fade02b3b9d5387ecfc.zip: 50%|████▉ | 13.0M/26.0M [00:00<00:00, 68.9MB/s]
9cb84068c0190fade02b3b9d5387ecfc.zip: 85%|████████▍ | 22.0M/26.0M [00:00<00:00, 79.4MB/s]
0%| | 0/36 [00:00<?, ?it/s]
6%|▌ | 2/33 [02:13<35:37, 68.95s/it]2025-05-30 14:00:31,102 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:00:31,157 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:00:31,376 INFO Request ID is d5a95d60-2043-4138-ad8d-250005f98a07
2025-05-30 14:00:31,415 INFO status has been updated to accepted
2025-05-30 14:00:45,337 INFO status has been updated to running
2025-05-30 14:01:21,898 INFO status has been updated to successful
8a4cb70ed14343bbd1573f68a252ed83.zip: 0%| | 0.00/26.1M [00:00<?, ?B/s]
8a4cb70ed14343bbd1573f68a252ed83.zip: 19%|█▉ | 5.00M/26.1M [00:00<00:00, 50.2MB/s]
8a4cb70ed14343bbd1573f68a252ed83.zip: 57%|█████▋ | 15.0M/26.1M [00:00<00:00, 77.4MB/s]
8a4cb70ed14343bbd1573f68a252ed83.zip: 92%|█████████▏| 24.0M/26.1M [00:00<00:00, 84.8MB/s]
0%| | 0/36 [00:00<?, ?it/s]
9%|▉ | 3/33 [03:07<31:01, 62.06s/it]2025-05-30 14:01:24,585 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:01:24,606 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:01:25,751 INFO Request ID is bac30811-b400-49ce-91c2-40031921beab
2025-05-30 14:01:25,791 INFO status has been updated to accepted
2025-05-30 14:01:48,542 INFO status has been updated to running
2025-05-30 14:02:17,300 INFO status has been updated to successful
275a343c8f692cce5fed684ac383849f.zip: 0%| | 0.00/26.2M [00:00<?, ?B/s]
275a343c8f692cce5fed684ac383849f.zip: 8%|▊ | 2.00M/26.2M [00:00<00:01, 19.2MB/s]
275a343c8f692cce5fed684ac383849f.zip: 38%|███▊ | 10.0M/26.2M [00:00<00:00, 53.3MB/s]
275a343c8f692cce5fed684ac383849f.zip: 76%|███████▋ | 20.0M/26.2M [00:00<00:00, 72.5MB/s]
0%| | 0/36 [00:00<?, ?it/s]
12%|█▏ | 4/33 [04:02<28:33, 59.10s/it]2025-05-30 14:02:19,150 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:02:19,248 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:02:19,528 INFO Request ID is d5cf5bf0-78ef-4366-b9cd-de981f790ddb
2025-05-30 14:02:19,546 INFO status has been updated to accepted
2025-05-30 14:02:27,786 INFO status has been updated to running
2025-05-30 14:03:09,218 INFO status has been updated to successful
82aacc5742394dc259c508ad10c1aa79.zip: 0%| | 0.00/26.6M [00:00<?, ?B/s]
82aacc5742394dc259c508ad10c1aa79.zip: 11%|█▏ | 3.00M/26.6M [00:00<00:00, 30.9MB/s]
82aacc5742394dc259c508ad10c1aa79.zip: 45%|████▌ | 12.0M/26.6M [00:00<00:00, 66.5MB/s]
82aacc5742394dc259c508ad10c1aa79.zip: 83%|████████▎ | 22.0M/26.6M [00:00<00:00, 83.5MB/s]
0%| | 0/36 [00:00<?, ?it/s]
15%|█▌ | 5/33 [04:54<26:20, 56.45s/it]2025-05-30 14:03:10,712 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:03:10,755 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:03:11,229 INFO Request ID is 1e44b1ed-e618-4f73-87c1-8d9cb3982e1b
2025-05-30 14:03:11,269 INFO status has been updated to accepted
2025-05-30 14:03:44,123 INFO status has been updated to running
2025-05-30 14:04:01,238 INFO status has been updated to successful
ba2522f33da81a879f84e729c093854b.zip: 0%| | 0.00/26.2M [00:00<?, ?B/s]
ba2522f33da81a879f84e729c093854b.zip: 23%|██▎ | 6.00M/26.2M [00:00<00:00, 57.7MB/s]
ba2522f33da81a879f84e729c093854b.zip: 53%|█████▎ | 14.0M/26.2M [00:00<00:00, 71.5MB/s]
ba2522f33da81a879f84e729c093854b.zip: 92%|█████████▏| 24.0M/26.2M [00:00<00:00, 83.1MB/s]
0%| | 0/36 [00:00<?, ?it/s]
18%|█▊ | 6/33 [05:46<24:47, 55.08s/it]2025-05-30 14:04:03,245 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:03,328 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:03,630 INFO Request ID is 7939fad6-0848-4c05-946a-4eec7689339a
2025-05-30 14:04:03,669 INFO status has been updated to accepted
2025-05-30 14:04:25,019 INFO status has been updated to running
2025-05-30 14:04:53,667 INFO status has been updated to successful
e8e7e4a6c2e2963373d9a87c7fada1f9.zip: 0%| | 0.00/26.6M [00:00<?, ?B/s]
e8e7e4a6c2e2963373d9a87c7fada1f9.zip: 15%|█▌ | 4.00M/26.6M [00:00<00:00, 37.8MB/s]
e8e7e4a6c2e2963373d9a87c7fada1f9.zip: 53%|█████▎ | 14.0M/26.6M [00:00<00:00, 74.7MB/s]
e8e7e4a6c2e2963373d9a87c7fada1f9.zip: 90%|█████████ | 24.0M/26.6M [00:00<00:00, 87.4MB/s]
0%| | 0/36 [00:00<?, ?it/s]
21%|██ | 7/33 [06:38<23:28, 54.19s/it]2025-05-30 14:04:55,489 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:55,515 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:04:55,802 INFO Request ID is 8303497f-ab10-46ba-ac0b-dc30693c56a1
2025-05-30 14:04:55,824 INFO status has been updated to accepted
2025-05-30 14:05:16,871 INFO status has been updated to running
2025-05-30 14:05:45,474 INFO status has been updated to successful
e9af2272cdaf443ae4ff9416f2469085.zip: 0%| | 0.00/26.9M [00:00<?, ?B/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 4%|▎ | 1.00M/26.9M [00:01<00:26, 1.04MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 15%|█▍ | 4.00M/26.9M [00:01<00:05, 4.73MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 37%|███▋ | 10.0M/26.9M [00:01<00:01, 12.7MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 60%|█████▉ | 16.0M/26.9M [00:01<00:00, 19.8MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 74%|███████▍ | 20.0M/26.9M [00:03<00:01, 4.91MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 86%|████████▌ | 23.0M/26.9M [00:03<00:00, 5.57MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 93%|█████████▎| 25.0M/26.9M [00:04<00:00, 6.18MB/s]
e9af2272cdaf443ae4ff9416f2469085.zip: 100%|██████████| 26.9M/26.9M [00:04<00:00, 7.03MB/s]
0%| | 0/36 [00:00<?, ?it/s]
24%|██▍ | 8/33 [07:34<22:50, 54.81s/it]2025-05-30 14:05:51,631 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:05:51,671 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:05:52,944 INFO Request ID is 271d15d1-27cb-4526-884f-0c294f4e6432
2025-05-30 14:05:53,322 INFO status has been updated to accepted
2025-05-30 14:06:15,136 INFO status has been updated to running
2025-05-30 14:07:09,950 INFO status has been updated to successful
f879ae8c8090bd5eff88e44e7d9aaece.zip: 0%| | 0.00/26.9M [00:00<?, ?B/s]
f879ae8c8090bd5eff88e44e7d9aaece.zip: 19%|█▊ | 5.00M/26.9M [00:00<00:00, 46.8MB/s]
f879ae8c8090bd5eff88e44e7d9aaece.zip: 60%|█████▉ | 16.0M/26.9M [00:00<00:00, 81.6MB/s]
f879ae8c8090bd5eff88e44e7d9aaece.zip: 100%|██████████| 26.9M/26.9M [00:00<00:00, 92.5MB/s]
0%| | 0/36 [00:00<?, ?it/s]
27%|██▋ | 9/33 [08:54<25:04, 62.68s/it]2025-05-30 14:07:11,626 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:07:11,647 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:07:12,016 INFO Request ID is 1780221e-bfac-445f-ba16-ed802f2a0312
2025-05-30 14:07:12,059 INFO status has been updated to accepted
2025-05-30 14:08:02,071 INFO status has been updated to running
2025-05-30 14:09:06,583 INFO status has been updated to successful
97bd3e3007ba398739443bdb19520a84.zip: 0%| | 0.00/26.8M [00:00<?, ?B/s]
97bd3e3007ba398739443bdb19520a84.zip: 11%|█ | 3.00M/26.8M [00:00<00:00, 28.7MB/s]
97bd3e3007ba398739443bdb19520a84.zip: 48%|████▊ | 13.0M/26.8M [00:00<00:00, 68.4MB/s]
97bd3e3007ba398739443bdb19520a84.zip: 89%|████████▉ | 24.0M/26.8M [00:00<00:00, 84.8MB/s]
0%| | 0/36 [00:00<?, ?it/s]
82%|████████▏ | 27/33 [10:56<00:03, 1.88it/s]2025-05-30 14:09:13,271 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:09:13,299 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:09:15,277 INFO Request ID is c4ce04d3-93c2-4a86-a6b8-9f619f7c0731
2025-05-30 14:09:15,314 INFO status has been updated to accepted
2025-05-30 14:10:05,592 INFO status has been updated to running
2025-05-30 14:10:31,269 INFO status has been updated to successful
ce48a37d9b3c52e10c40b3e5a2244f17.zip: 0%| | 0.00/26.7M [00:00<?, ?B/s]
ce48a37d9b3c52e10c40b3e5a2244f17.zip: 4%|▎ | 1.00M/26.7M [00:00<00:03, 7.44MB/s]
ce48a37d9b3c52e10c40b3e5a2244f17.zip: 37%|███▋ | 10.0M/26.7M [00:00<00:00, 49.9MB/s]
ce48a37d9b3c52e10c40b3e5a2244f17.zip: 71%|███████ | 19.0M/26.7M [00:00<00:00, 68.2MB/s]
0%| | 0/36 [00:00<?, ?it/s]
85%|████████▍ | 28/33 [12:16<02:00, 24.18s/it]2025-05-30 14:10:33,116 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:10:33,139 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:10:33,719 INFO Request ID is ad9d438a-233c-4386-82c2-6bb25dbecbc8
2025-05-30 14:10:33,762 INFO status has been updated to accepted
2025-05-30 14:10:47,253 INFO status has been updated to running
2025-05-30 14:11:23,483 INFO status has been updated to successful
e3a5f999dfccd90b3177d7e8173dce8d.zip: 0%| | 0.00/26.8M [00:00<?, ?B/s]
e3a5f999dfccd90b3177d7e8173dce8d.zip: 11%|█ | 3.00M/26.8M [00:00<00:00, 28.6MB/s]
e3a5f999dfccd90b3177d7e8173dce8d.zip: 49%|████▊ | 13.0M/26.8M [00:00<00:00, 67.8MB/s]
e3a5f999dfccd90b3177d7e8173dce8d.zip: 86%|████████▌ | 23.0M/26.8M [00:00<00:00, 81.0MB/s]
0%| | 0/36 [00:00<?, ?it/s]
88%|████████▊ | 29/33 [13:08<02:10, 32.55s/it]2025-05-30 14:11:25,279 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:11:25,317 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:11:25,665 INFO Request ID is 6f05d4af-2fea-4d0c-9b46-64dab810a89e
2025-05-30 14:11:25,693 INFO status has been updated to accepted
2025-05-30 14:11:58,617 INFO status has been updated to running
2025-05-30 14:12:41,606 INFO status has been updated to successful
cd97b177a9fadf232130d4ab7601b3ca.zip: 0%| | 0.00/27.2M [00:00<?, ?B/s]
cd97b177a9fadf232130d4ab7601b3ca.zip: 4%|▎ | 1.00M/27.2M [00:00<00:03, 6.87MB/s]
cd97b177a9fadf232130d4ab7601b3ca.zip: 37%|███▋ | 10.0M/27.2M [00:00<00:00, 47.3MB/s]
cd97b177a9fadf232130d4ab7601b3ca.zip: 70%|██████▉ | 19.0M/27.2M [00:00<00:00, 65.3MB/s]
0%| | 0/36 [00:00<?, ?it/s]
91%|█████████ | 30/33 [14:27<02:18, 46.31s/it]2025-05-30 14:12:43,884 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:12:44,167 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:12:44,687 INFO Request ID is c98b0f91-4e2b-4676-9b8f-c495ac93ef46
2025-05-30 14:12:44,796 INFO status has been updated to accepted
2025-05-30 14:13:05,823 INFO status has been updated to running
2025-05-30 14:13:34,558 INFO status has been updated to successful
c886ef2b5cd4410517c8364fcfc842c0.zip: 0%| | 0.00/27.4M [00:00<?, ?B/s]
c886ef2b5cd4410517c8364fcfc842c0.zip: 15%|█▍ | 4.00M/27.4M [00:00<00:00, 39.0MB/s]
c886ef2b5cd4410517c8364fcfc842c0.zip: 40%|████ | 11.0M/27.4M [00:00<00:00, 57.2MB/s]
c886ef2b5cd4410517c8364fcfc842c0.zip: 77%|███████▋ | 21.0M/27.4M [00:00<00:00, 77.6MB/s]
0%| | 0/36 [00:00<?, ?it/s]
94%|█████████▍| 31/33 [15:19<01:36, 48.09s/it]2025-05-30 14:13:36,101 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:13:36,126 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
2025-05-30 14:13:37,050 INFO Request ID is 207a7e8c-d035-4ecb-acf4-81bcdb15d9c6
2025-05-30 14:13:37,073 INFO status has been updated to accepted
2025-05-30 14:13:45,866 INFO status has been updated to running
2025-05-30 14:14:10,083 INFO status has been updated to successful
b0e8b3b8145f8c1948e136442230a4e8.zip: 0%| | 0.00/27.8M [00:00<?, ?B/s]
b0e8b3b8145f8c1948e136442230a4e8.zip: 14%|█▍ | 4.00M/27.8M [00:00<00:00, 32.7MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip: 36%|███▌ | 10.0M/27.8M [00:00<00:00, 46.3MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip: 54%|█████▍ | 15.0M/27.8M [00:00<00:00, 44.8MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip: 72%|███████▏ | 20.0M/27.8M [00:00<00:00, 42.3MB/s]
b0e8b3b8145f8c1948e136442230a4e8.zip: 90%|█████████ | 25.0M/27.8M [00:00<00:00, 43.1MB/s]
0%| | 0/36 [00:00<?, ?it/s]
100%|██████████| 33/33 [15:55<00:00, 28.96s/it]
/data/common/miniforge3/envs/wp5/lib/python3.11/site-packages/pyogrio/geopandas.py:275: UserWarning: More than one layer found in 'pyogrio_caa0acd978ca4858b07f80da53aa85ab.zip': 'Continents' (default), 'Africa', 'North America', 'Europe', 'Oceania', 'South America', 'Asia', 'Antarctica', 'Australia'. Specify layer parameter to avoid this warning.
result = read_func(
2. Calculate Surface Soil Moisture Anomaly#
The Surface Soil Moisture Anomaly (referred to as SSMA hereafter) was calculated following a similar approach as the one explained by the European Drought Observatory (EDO) [1]. Surface soil moisture values for each pixel and each dekad from April to July 2023 were compared to the long-term climatological period (1991–2020, 30 years). The anomaly was computed using the following equation:
\(\text{SMA} = \frac{\text{SMI}_t - \overline{\text{SMI}}}{\delta_{\text{SMI}}}\)
where:
\(\text{SMI}_t\) = Surface soil moisture 2023 for a specific dekad for that pixel
\(\overline{\text{SMI}}\) = Mean surface soil moisture 1991-2020 for that same dekad for that pixel
\(\delta_{\text{SMI}}\) = Standard deviation surface soil moisture 1991-2020 for that same dekad for that pixel
Show code cell source
#Select soil mouisture variable
da=ds["sm"]
# Filter the shapefile to keep only Europe
europe_shape = world_shape[world_shape['CONTINENT'] == 'Europe']
# Ensure soil_moisture has CRS information compatible with europe_shape (e.g., EPSG:4326)
da.rio.write_crs("EPSG:4326", inplace=True)
# Clip soil moisture data to the Europe shape
da_eu = da.rio.clip(europe_shape.geometry, europe_shape.crs, drop=True)
Show code cell source
# Select data for the two time intervals.
da_long_term = da_eu.sel(time=slice("1991-01-01", "2020-12-21"))
#Group by day of th year and them calculate the mean and standard deviation.
#The available days in each month are 1, 11 and 21,
#they correspont to the 1st, 2nd and 3rd dekad of the month.
doy_long_term = da_long_term.groupby("time.dayofyear")
mean_smi_long_term = doy_long_term.mean(dim="time")
std_smi_long_term = doy_long_term.std(dim="time")
Show code cell source
#Select the data of the year 2023 and calculate the mean same as before.
da_2023 = da_eu.sel(time=slice("2023-01-01", "2023-12-21"))
doy_2023 = da_2023.groupby("time.dayofyear")
smi_2023 = doy_2023.mean(dim="time")
Show code cell source
# Replace zeros in std with NaNs to avoid division by zero
std_smi_long_term_safe = std_smi_long_term.where(std_smi_long_term != 0)
# Calculate SMA safely
sma = (smi_2023 - mean_smi_long_term) / std_smi_long_term_safe
sma = sma.where(np.isfinite(sma)) # Replace inf/-inf with NaN
3. SSMA visualization#
Map of Europe SSMA#
Show code cell source
# Define custom colormap and boundaries
colors = [
"#b35806ff", # <-2
"#f1a340ff", # -2 to -1.5
"#fee0b6ff", # -1.5 to -1
"#ffffffff", # -1 to 1
"#d1e5f0ff", # 1 to 1.5
"#67a9cfff", # 1.5 to 2
"#2166acff" # >= 2
]
bounds = [-100, -2, -1.5, -1, 1, 1.5, 2, 100] # Define boundaries
# Create colormap and norm
cmap = mcolors.ListedColormap(colors)
cmap.set_bad(color='lightgray') # Gray for no data
norm = mcolors.BoundaryNorm(bounds, ncolors=len(colors), clip=True)
Show code cell source
boxes = [
{
'label': 'Iberian Peninsula',
'min_lat': 35, 'max_lat': 44,
'min_lon': -10, 'max_lon': 5,
'color': 'red'
},
{
'label': 'Great Britain and Ireland',
'min_lat': 50, 'max_lat': 60,
'min_lon': -11, 'max_lon': 2,
'color': 'orange'},
{
'label': 'Southern Balkans and South Italy',
'min_lat': 36, 'max_lat': 47,
'min_lon': 7, 'max_lon': 24,
'color': 'green'
},
{
'label': 'Nordic and Baltic region',
'min_lat': 55, 'max_lat': 71,
'min_lon': 5, 'max_lon': 28,
'color': 'blue'
},
{
'label': 'Germany–Benelux–Poland',
'min_lat': 48, 'max_lat': 54,
'min_lon': 4, 'max_lon': 25,
'color': 'purple'
}
]
Show code cell source
# Dekad DOYs and labels
dekad_days = [
[91, 101, 111], # April
[121, 131, 141], # May
[152, 162, 172], # June
[182, 192, 202], # July
]
month_labels = ['April', 'May', 'June', 'July']
dekad_labels = ['1st Dekad', '2nd Dekad', '3rd Dekad']
# Flatten DOYs and labels
all_doys = [doy for sublist in dekad_days for doy in sublist]
all_labels = [f"{month} - {dekad}" for month in month_labels for dekad in dekad_labels]
# === Create figure and axis ===
fig, ax = plt.subplots(figsize=(8, 6), subplot_kw={'projection': ccrs.LambertConformal(central_longitude=10, central_latitude=50)}, dpi=250)
ax.set_extent([-15, 35, 35, 72], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.BORDERS, linestyle='-', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='lightgray')
# === Add colored rectangles ===
def add_rectangles(ax):
for box in boxes:
width = box['max_lon'] - box['min_lon']
height = box['max_lat'] - box['min_lat']
rect = Rectangle(
(box['min_lon'], box['min_lat']),
width,
height,
linewidth=1,
edgecolor=box['color'],
facecolor='none',
transform=ccrs.PlateCarree(),
zorder=5
)
ax.add_patch(rect)
add_rectangles(ax)
# === Initial frame ===
sm_init = sma.sel(dayofyear=all_doys[0]).where(sma.sel(dayofyear=all_doys[0]) != 0, np.nan)
im = sm_init.plot(
ax=ax, transform=ccrs.PlateCarree(),
cmap=cmap, norm=norm, add_colorbar=False # <- disable auto colorbar
)
title = ax.set_title(f"Surface Soil Moisture Anomaly\n{all_labels[0]}", fontsize=10)
# Define bounds and ticks
ticks = bounds[1:-1]
# Add manual shared colorbar
cbar = fig.colorbar(
im, ax=ax, orientation='horizontal',
fraction=0.03, pad=0.06, shrink=0.9,
ticks=ticks, extend='both'
)
cbar.ax.tick_params(labelsize=8) # Make tick numbers smaller
cbar.set_label('SSMA', fontsize=9)
# === Animation update function ===
def update(frame_idx):
doy = all_doys[frame_idx]
label = all_labels[frame_idx]
sm_doy = sma.sel(dayofyear=doy).where(sma.sel(dayofyear=doy) != 0, np.nan)
im.set_array(sm_doy.values.flatten()) # Update the image data
title.set_text(f"Surface Soil Moisture Anomaly\n{label}")
return im,
# === Create and save animation ===
ani = animation.FuncAnimation(
fig, update, frames=len(all_doys), blit=False, interval=1000
)
ani.save("/data/wp5/trigoso_camila/SoilMoisture/fig/soil_moisture_animv2.gif", writer='pillow', dpi=250)
plt.show()
Show code cell output


Fig. 1.5.1.1 Surface soil moisture anomalies in Europe for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#
Regional SSMA plots#
The mean SSMA of the regions marked by boxes in Fig. 1.5.1.1 were plotted over time.
Show code cell source
def plot_sma_mean_over_region(
sma_data,
min_lat=35,
max_lat=45,
min_lon=-10,
max_lon=5,
start_doy=91,
end_doy=202,
title="Average Soil Moisture Anomaly over Iberian Peninsula",
color="blue",
year=2023 # specify year for converting DOY to date
):
# Subset by region
sma_subset = sma_data.sel(
longitude=slice(min_lon, max_lon),
latitude=slice(max_lat, min_lat) # decreasing lat
)
# Ensure DOY values are valid
available_doys = sma_subset.dayofyear.values
target_doys = [doy for doy in available_doys if start_doy <= doy <= end_doy]
if not target_doys:
print(f"No matching DOYs in range {start_doy}–{end_doy}.")
return
# Subset by DOY
sma_subset = sma_subset.sel(dayofyear=target_doys)
# Mean over space
sma_mean = sma_subset.mean(dim=["latitude", "longitude"], skipna=True)
# Convert DOY to date
date_index = pd.to_datetime([f"{year}-{doy}" for doy in sma_mean.dayofyear.values], format="%Y-%j")
# Plot
plt.figure(figsize=(10, 4), dpi=250)
plt.plot(date_index, sma_mean, marker='o', linestyle='-', color=color)
plt.title(f"{title}\n{date_index[0].strftime('%b %d')} to {date_index[-1].strftime('%b %d')}")
plt.xlabel("Date")
plt.ylabel("Mean SSMA")
plt.grid(True)
# Create custom ticks on 1st, 11th, 21st of each month
tick_days = [1, 11, 21]
tick_dates = pd.date_range(start=date_index[0], end=date_index[-1], freq='D')
custom_ticks = [d for d in tick_dates if d.day in tick_days]
# Set custom ticks and labels
plt.xticks(custom_ticks, [d.strftime('%b %d') for d in custom_ticks], rotation=45)
# Highlight 0 line
plt.axhline(0, color='black', linestyle='--', linewidth=1.5, label='Normal (SSMA=0)')
plt.legend()
plt.tight_layout()
plt.savefig(f"/data/wp5/trigoso_camila/SoilMoisture/fig/sm_region_{box['label']}.png", dpi=250, bbox_inches="tight")
plt.show()
Show code cell source
for box in boxes:
plot_sma_mean_over_region(
sma_data=sma,
min_lat=box['min_lat'],
max_lat=box['max_lat'],
min_lon=box['min_lon'],
max_lon=box['max_lon'],
start_doy=91,
end_doy=202,
title=f"SSMA over {box['label']} (Spring–Mid Summer 2023)",
color=box['color']
)
Show code cell output






Fig. 1.5.1.2 Surface soil moisture anomalies in the Iberian Peninsula for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

Fig. 1.5.1.3 Surface soil moisture anomalies in the Southern Balkans and South Italy for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#
On top of low rainfall, a significant spring heatwave amplified drought conditions in the western Mediterranean in April 2023 [2]. According to the European Commission (2023) [3] the Combined Drought Indicator (CDI) showed warning and alert conditions across much of the western Mediterranean by mid-May, with drought conditions worse than those observed at the same time of the year in 2022. This situation is reflected in the SSMA results for the Iberian Peninsula (see Fig. 1.5.1.2) The SSMA was notably negative, around -1.5 standard deviations, from April to mid-May. After late May, SSMA values increased, turning positive and gradually approaching normal conditions (near 0).
In contrast, crop-growing conditions improved in the Balkans, Italy, France, and Turkey during the same period [3]. The European Commission also reported flooding in parts of Italy and the western Balkans in May 2023, caused by heavy precipitation [5]. This is consistent with observations in Fig. 1.5.1.3, where the SSMA in southern Italy and the southern Balkans was strongly positive, reaching values above +1.5 standard deviations by mid-May.

Fig. 1.5.1.4 Surface soil moisture anomalies in Great Britain and Ireland for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#

Fig. 1.5.1.5 Surface soil moisture anomalies in Germany–Benelux–Poland for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#
Show code cell source
# === Choose specific year and DOY ===
chosen_year = 2023
chosen_doy = 152 # 1st Dekad of June
# === Extract data ===
sm_single = sma.sel(dayofyear=chosen_doy).where(
sma.sel(dayofyear=chosen_doy) != 0, np.nan
)
# === Create figure and axis ===
fig, ax = plt.subplots(
figsize=(8, 6),
subplot_kw={'projection': ccrs.LambertConformal(central_longitude=10, central_latitude=50)},
dpi=250
)
ax.set_extent([-15, 35, 35, 72], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.BORDERS, linestyle='-', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='lightgray')
# === Plot soil moisture ===
im = sm_single.plot(
ax=ax, transform=ccrs.PlateCarree(),
cmap=cmap, norm=norm, add_colorbar=False
)
# === Add title ===
month_idx = next(i for i, sublist in enumerate(dekad_days) if chosen_doy in sublist)
dekad_idx = dekad_days[month_idx].index(chosen_doy)
label = f"{month_labels[month_idx]} - {dekad_labels[dekad_idx]}"
ax.set_title(f"Surface Soil Moisture Anomaly\n{label} {chosen_year}", fontsize=10)
# === Add colorbar ===
ticks = bounds[1:-1]
cbar = fig.colorbar(
im, ax=ax, orientation='horizontal',
fraction=0.03, pad=0.06, shrink=0.9,
ticks=ticks, extend='both'
)
cbar.ax.tick_params(labelsize=8)
cbar.set_label('SSMA', fontsize=9)
# === Save the figure ===
plt.savefig(f"/data/wp5/trigoso_camila/SoilMoisture/fig/ssma_{chosen_year}_{chosen_doy}.png", dpi=250)
plt.show()
Show code cell output


Fig. 1.5.1.6 a) SSMA in early-June 2023 accoridng to the C3S-SM-COMBINED data. b) SMI Anomaly in early-June 2023 accoridng to the EDO, generated using Copernicus Emergency Management Service information (2025) [7].#
Great Britain, Ireland, and much of central Europe exhibited a notable negative SSMA peak at the beginning of June (see Fig. 1.5.1.4 and Fig. 1.5.1.5). This pattern aligns with reports that much of central and northern Europe experienced drier-than-normal conditions in June 2023 [6].
Fig. 1.5.1.6 (b) shows the Soil Moisture Index (SMI) Anomaly for early June, generated by the EDO [7]. This index is obtained using the LISFLOOD model, which “simulates soil moisture in two surface layers (skin layer and root zone) separately for forested and other layers. These four soil moisture layers are averaged daily to derive a single mean root zone soil moisture conditions to be successively standardized into SMI” [1].
While both the LISFLOOD model and the satellite-derived C3S-SM-COMBINED product reflect general drought trends, differences emerge due to what each system measures. C3S observations represent only the top centimeters of the soil (surface layer), which respond more quickly to short-term precipitation events. LISFLOOD, on the other hand, also takes into account the deeper root zone, which changes more slowly and captures longer-term drought stress.
As a result, while the C3S product shows wetter-than-usual surface soil moisture anomalies in the Iberian Peninsula by early June, LISFLOOD still indicates drier-than-normal conditions due to lingering root-zone deficits. Conversely, in central Europe (e.g., Benelux and Germany), C3S data show negative anomalies whereas LISFLOOD depicts mostly normal conditions, with only some patches of dryness.
Surface soil moisture is particularly useful for monitoring rapid changes on a regional scale. However, for agricultural drought monitoring, it is important to also consider long-term and subsurface moisture conditions, as reflected in root-zone models like LISFLOOD.

Fig. 1.5.1.7 Surface soil moisture anomalies in the Nordic and Baltic region for the period of Spring to Mid-Summer 2023 accoridng to the C3S-SM-COMBINED data.#
Show code cell source
# === Choose specific year and DOY ===
chosen_year = 2023
chosen_doy = 91 # 1st Dekad of April
# === Extract data ===
sm_single = sma.sel(dayofyear=chosen_doy).where(
sma.sel(dayofyear=chosen_doy) != 0, np.nan
)
# === Create figure and axis ===
fig, ax = plt.subplots(
figsize=(8, 6),
subplot_kw={'projection': ccrs.LambertConformal(central_longitude=10, central_latitude=50)},
dpi=250
)
ax.set_extent([5, 32, 54, 71], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.BORDERS, linestyle='-', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, facecolor='lightgray')
ax.add_feature(cfeature.OCEAN, facecolor='lightgray')
# === Plot soil moisture ===
im = sm_single.plot(
ax=ax, transform=ccrs.PlateCarree(),
cmap=cmap, norm=norm, add_colorbar=False
)
# === Add title ===
month_idx = next(i for i, sublist in enumerate(dekad_days) if chosen_doy in sublist)
dekad_idx = dekad_days[month_idx].index(chosen_doy)
label = f"{month_labels[month_idx]} - {dekad_labels[dekad_idx]}"
ax.set_title(f"Surface Soil Moisture Anomaly\n{label} {chosen_year}", fontsize=10)
# === Add colorbar ===
ticks = bounds[1:-1]
cbar = fig.colorbar(
im, ax=ax, orientation='horizontal',
fraction=0.03, pad=0.06, shrink=0.9,
ticks=ticks, extend='both'
)
cbar.ax.tick_params(labelsize=8)
cbar.set_label('SSMA', fontsize=9)
# === Save the figure ===
plt.savefig(f"/data/wp5/trigoso_camila/SoilMoisture/fig/ssma_{chosen_year}_{chosen_doy}.png", dpi=250)
plt.show()
Show code cell output


Fig. 1.5.1.8 Surface soil moisture anomalies in the Nordic and Baltic region for the period in the first dekad of April 2023 accoridng to the C3S-SM-COMBINED data.#
Fig. 1.5.1.7 shows that the Scandinavian Peninsula, as well as the Nordic and Baltic countries, were unusually dry during mid-spring and early summer 2023. However, the data for these regions in April is notably incomplete (see Fig. 1.5.1.8). During this period, valid soil moisture data are available only for the southernmost parts of the Scandinavian Peninsula. This lack of data can be attributed to the presence of snow cover and frozen soil still during spring. According to PUGS, the C3S Surface Soil Moisture v202312 product cannot retrieve meaningful data when the ground is snow-covered or frozen. Under such conditions, the dielectric properties of water change significantly, making satellite-based retrieval unreliable.
The results shown in this section are consistent with those presented in the European State of the Climate 2023 by Copernicus [4]. However, while that report presents monthly data using the C3S v202212 PASSIVE dataset, this analysis is based on a dekadal (10-day) data and uses the COMBINED v202312 product.
ℹ️ If you want to know more#
Markonis, Y., Kumar, R., Hanel, M., Rakovec, O., Máca, P., & AghaKouchak, A. (2021). The rise of compound warm-season droughts in Europe. Science Advances, 7(6), eabb9668.
Ministerio para la Transición Ecológica y el Reto Demográfico (2023). El 14,6% del territorio está en emergencia por escasez de agua y el 27,4%, en alerta. Nota de prensa.
Laguardia, G. & Niemeyer, S. (2008). On the comparison between the LISFLOOD modelled and the ERS/SCAT derived soil moisture estimates. Hydrol. Earth Syst. Sci., 12, 1339–1351.
Key resources#
Code libraries used:
C3S EQC custom functions,
c3s_eqc_automatic_quality_control
, prepared by B-Open
Dataset documentation: SM v202212: Product User Guide and Specification (PUGS)
References#
[1] European Commission (2019). EDO INDICATOR FACTSHEET Soil Moisture Anomaly (SMA). European Drought Observatory.
[2] Lemus-Canovas, M., Insua-Costa, D., Trigo, R. & Miralles, D. (2024). Record-shattering 2023 Spring heatwave in western Mediterranean amplified by long-term drought. npj Clim Atmos Sci 7, 25.
[3] European Commission (2023a). Severe drought: western Mediterranean faces low river flows and crop yields earlier than ever. European Drought Observatory. The Joint Research Centre: EU Science Hub.
[4] European Commission (2023b). Europe in 2023 Soil Moisture.
[5] European Commission (2023c). Precipitation, relative humidity and soil moisture for May 2023.
[6] Toreti, A., Bavera, D., Acosta Navarro, J., Arias-Muñoz, C., Barbosa, P., De Jager, A., Di Ciollo, C., Fioravanti, G., Grimaldi, S., Hrast Essenfelder, A., Maetens, W., Magni, D., Masante, D., Mazzeschi, M., Mccormick, N. & Salamon, P. (2023). Drought in Europe June 2023. Publications Office of the European Union, Luxembourg, 2023, doi:10.2760/575433, JRC134492.
[7] Copernicus Emergency Management Service (2025). European Drought Observatory map.