CoolFace
Datasetpublic

it4lia/soil_moisture_dataset

Soil Moisture Dataset Dataset Description A dataset of soil moisture measurements collected from on-field tensiometers and volumetric sensors, correlated with irrigation records, weather observations, satellite-derived vegetation indices, and static soil and crop characterisation. Covers an anonymised agricultural area in Trentino, Italy, across three regional consortiums. Producer: Fondazione Bruno Kessler (FBK) — OpenIoT research unit Project ID:… See the full description on the dataset page: https://huggingface.co/datasets/it4lia/soil_moisture_dataset.

sourceHugging Facecc-by-nc-nd-4.0updated 6mo agoView on Hugging Face
0likes446downloads
Dataset Card

Soil Moisture Dataset

Dataset Description

A dataset of soil moisture measurements collected from on-field tensiometers and volumetric sensors, correlated with irrigation records, weather observations, satellite-derived vegetation indices, and static soil and crop characterisation. Covers an anonymised agricultural area in Trentino, Italy, across three regional consortiums.

  • Producer: Fondazione Bruno Kessler (FBK) — OpenIoT research unit
  • Project ID: fbk.aif.soil_moisture_dataset
  • Repository: it4lia/soil_moisture_dataset
  • Access: Openly accessible via HuggingFace; pandas is sufficient to read all Parquet files
  • Useful for: agronomists, irrigation managers, researchers, and developers working on irrigation decision-support and crop water management

Dataset Structure

Repository file tree

soil_moisture_dataset/
├── field_sensor_data_consortium{0,1,2}.parquet       # IoT sensor measurements
├── irrigation_data_consortium{0,1,2}.parquet         # Irrigation data
├── locations_ids_consortium{0,1,2}.parquet           # Location reference
├── historical_weather_data_consortium{0,1,2}.parquet # Historical weather data
├── forecasted_weather_data_consortium{0,1,2}.parquet # 7-day weather forecast
├── weather_data_consortium{0,1}.parquet              # On-site weather station
├── soil_type_data_consortium{0,1}.parquet            # Soil properties
├── remote_sensing_data_final_consortium{0,1}.parquet # Satellite spectral
└── crop_type_data_consortium{0,1,2}.pickle           # Crop information

Consortium summary:

Sub-datasetC0 (66 loc)C1 (50 loc)C2 (26 loc)
fieldsensordata
irrigation_data
locations_ids
historicalweatherdata
forecastedweatherdata
weather_data (on-site)
soiltypedata
remotesensingdata
croptypedata (pickle)

Join keys

KeyUse
datastream_namePrimary join key across all sub-datasets
datastream_idNumeric alternative where available

Dataset Creation

Data sources (from data provider)

Data typeOrigin
Soil moisture & irrigationOn-field IoT sensors owned by the FBK OpenIoT research unit
Weather (on-site)Data from on-field weather station sensors
Weather (historical/forecasted gridded)Public weather data
Satellite imageryPublic satellite data
Soil propertiesSoil type information
Crop parametersCrop type information

Collection

  • Provider: Fondazione Bruno Kessler (FBK), OpenIoT research unit, Trentino, Italy
  • Geographic coverage: Anonymised agricultural area in Trentino (exact locations not disclosed)
  • Temporal coverage: 2023 and 2024 growing seasons
  • Frequency: Daily
  • Format: Apache Parquet (tabular data) + Python Pickle (crop model objects)

Observed date ranges (from files)

Sub-datasetC0C1C2
fieldsensordata2023-01-03 → 2024-12-032024-01-01 → 2024-11-142024-04-10 → 2025-08-25
irrigation_data2023-07-01 → 2024-10-152024-05-07 → 2024-12-312024-04-15 → 2025-08-25
historicalweatherdata2023-01-01 → 2025-09-302023-01-01 → 2025-09-302023-01-01 → 2025-09-30
forecastedweatherdata2023-01-01 → 2025-09-292023-01-01 → 2025-09-292023-01-01 → 2025-09-29
weather_data (on-site)2023-01-01 → 2024-12-312023-01-01 → 2024-12-31
remotesensingdataN/AN/AN/A—

Dataset Statistics

Row counts

Sub-datasetC0C1C2Total
fieldsensordata13,3464,7054,98123,032
irrigation_data1,1922,5875494,328
locations_ids665026142
weather_data (on-site)7317311,462
historicalweatherdata66,26450,20026,104142,568
forecastedweatherdata66,19850,15026,078142,426
soiltypedata6650116
remotesensingdata24,07220,06044,132
Grand total358,206

File sizes (compressed Parquet on disk)

Sub-datasetC0C1C2Sub-total
fieldsensordata134 KB38 KB55 KB227 KB
irrigation_data7 KB12 KB6 KB25 KB
locations_ids5 KB5 KB4 KB14 KB
weather_data89 KB45 KB134 KB
historicalweatherdata1,515 KB1,444 KB142 KB3,101 KB
forecastedweatherdata9,064 KB10,771 KB1,372 KB21,207 KB
soiltypedata11 KB11 KB22 KB
remotesensingdata1,152 KB4,497 KB5,649 KB
Total Parquet~30.4 MB

Limitations

  • Geographic coverage is a single Italian region (Trentino). Generalisation to other climates is not validated.
  • Exact field locations are anonymised; coordinates cannot be used for spatial analysis.
  • Sensor placement reflects operational decisions of the FBK OpenIoT unit, which may introduce selection bias toward actively managed fields.
  • Crop model parameters (crop_type_data) are defined at consortium level, not per location.

Usage

python
import pandas as pd
import glob

# Load and concatenate field sensor data across all consortiums
# Note: cast ground_offset to float to handle int64 vs float64 difference in C2
dfs = []
for f in sorted(glob.glob("field_sensor_data_consortium*.parquet")):
    df = pd.read_parquet(f)
    df["ground_offset"] = df["ground_offset"].astype(float)
    dfs.append(df)
sensors = pd.concat(dfs)

# Filter to Water Content sensors only (not available in C1)
wc = sensors[sensors["sensor_type"] == "Water Content"]

# Load historical weather (note: datastream_name is the last column)
weather = pd.concat([
    pd.read_parquet(f) for f in sorted(glob.glob("historical_weather_data_consortium*.parquet"))
])

# Load remote sensing (columns are lowercase: ndvi, grvi, etc.)
rs = pd.concat([
    pd.read_parquet(f) for f in sorted(glob.glob("remote_sensing_data_final_consortium*.parquet"))
])
# Replace Inf before use
import numpy as np
rs = rs.replace([np.inf, -np.inf], np.nan)

For crop model objects (requires `aquacrop`):

python
import pickle
with open("crop_type_data_consortium0.pickle", "rb") as f:
    crop = pickle.load(f)