Overview
Expert-compiled ecological requirements for 2,568 plant species from the FAO EcoCrop database: optimal and absolute ranges of temperature, rainfall, soil pH, latitude and altitude, killing temperatures, crop cycle length in days, plus categorical soil, light, photoperiod, climate zone and life-form attributes. One row per species, keyed by EcoPort code. The table is a cleaned copy of the CSV snapshot published by the OpenCLIM EcoCrop suitability model (UK Centre for Ecology & Hydrology), with the FAO column codes kept so values map directly onto EcoCrop-type suitability models.
Important note
Values are expert estimates of uneven provenance, not measurements. 495 of 2,568 species have no temperature or rainfall thresholds at all; killing temperature is missing for 1,411. A few rows hold obvious errors in the source (latitude limits above 90, an optimal minimum temperature of 160 for Barringtonia racemosa) that are kept as published. EcoCrop records rainfall as an annual total; suitability models usually apply it over the crop cycle (gmin to gmax days).
Quick start
import pandas as pd
url = "https://digital-atlas.s3.amazonaws.com/cdh/data/ecocrop/ecocrop.parquet"
df = pd.read_parquet(url)library(arrow)
url <- "https://digital-atlas.s3.amazonaws.com/cdh/data/ecocrop/ecocrop.parquet"
df <- read_parquet(url)Intended uses
- parameterising EcoCrop-type climatic suitability models with temperature, rainfall and crop-cycle thresholds
- screening candidate crops for a location by temperature, rainfall, soil and photoperiod requirements
- looking up species attributes by scientific name, EcoPort code or use category
Not recommended for
Why: Values are expert estimates with no per-species provenance, and some rows hold obvious errors.
Why: EcoCrop records rainfall as an annual total; suitability models reinterpret it over the crop cycle and results differ.
Commodities
Access & use
Files, endpoints, and worked examples for each distribution.
Data
One row per species.
Format: Apache Parquet — best for tabular analysis, with fast filtered reads in pandas, R, or DuckDB
Variables: scientificname, auth, famname, syno, comname, lifo +48 more
Dimensions: ecoportcode
Access the dataDownload
https://digital-atlas.s3.amazonaws.com/cdh/data/ecocrop/ecocrop.parquet
Usage examples
import duckdb
url = "https://digital-atlas.s3.amazonaws.com/cdh/data/ecocrop/ecocrop.parquet"
# Fetches only the columns and row groups the query needs
df = duckdb.sql(f"""
SELECT * -- or name the columns you need
FROM read_parquet('{url}')
-- WHERE <column> = '<value>'
LIMIT 100
""").df()library(duckdb)
url <- "https://digital-atlas.s3.amazonaws.com/cdh/data/ecocrop/ecocrop.parquet"
# Fetches only the columns and row groups the query needs
con <- dbConnect(duckdb())
df <- dbGetQuery(con, sprintf("
SELECT * -- or name the columns you need
FROM read_parquet('%s')
-- WHERE <column> = '<value>'
LIMIT 100
", url))Other access methods
Additional assets
Source column code to description list from the OpenCLIM repository.
Format: text/csv
Data dictionary
What each file holds. A layout describes how the data is stored in a file: its variables, the dimensions they vary over, and any keys.
File layouts
| Files | Format | Variables | Dimensions |
|---|---|---|---|
| table | Apache Parquet | scientificname, auth, famname, syno +50 more | ecoportcode |
Variables
| Variable | Type | Unit | Description |
|---|---|---|---|
| scientificname | string | — | Accepted scientific name (genus and species). |
| auth | string | — | Taxonomic authority for the scientific name. |
| famname | string | — | Classification path class:subclass:order:family, colon-separated. |
| syno | array | — | Synonyms, split on commas outside parentheses; items are free text as published. List of strings. |
| comname | array | — | Common names in many languages, split on commas outside parentheses. List of strings. |
| lifo | array | — | Life form: tree, shrub, herb, grass, vine, or combinations. List of strings. |
| habi | array | — | Growth habit: erect, prostrate/procumbent/semi-erect, climber/scrambler/scadent. List of strings. |
| lispa | array | — | Life span: annual, biennial, perennial. List of strings. |
| phys | array | — | Physiology: single stem, multi stem, evergreen, deciduous, C3/C4 and similar. List of strings. |
| cat | array | — | Use category: cereals & pseudocereals, vegetables, forage/pasture, forest/wood, medicinals & aromatic, and others. List of strings. |
| plat | array | — | Plant attributes: grown on large scale, grown on small scale, harvested from wild. List of strings. |
| prosy | array | — | Production system: large scale/commercial, small scale (manual), home garden, and others. List of strings. |
| topmn | int64 | degC | Optimal minimum temperature. |
| topmx | int64 | degC | Optimal maximum temperature. |
| tmin | int64 | degC | Absolute minimum temperature; growth stops below this. |
| tmax | int64 | degC | Absolute maximum temperature; growth stops above this. |
| ktmp | int64 | degC | Killing temperature during early growth. Missing for 1,411 species. |
| ktmpr | int64 | degC | Killing temperature during rest (dormancy). Missing for 1,411 species. |
| ropmn | int64 | mm | Optimal minimum rainfall, recorded by EcoCrop as an annual total. |
| ropmx | int64 | mm | Optimal maximum rainfall, annual total. |
| rmin | int64 | mm | Absolute minimum rainfall, annual total. |
| rmax | int64 | mm | Absolute maximum rainfall, annual total. |
| gmin | int64 | d | Minimum crop cycle, days from sowing or planting to harvest. |
| gmax | int64 | d | Maximum crop cycle in days. Perennials are commonly recorded as 365. |
| phopmn | float64 | [pH] | Optimal minimum soil pH. |
| phopmx | float64 | [pH] | Optimal maximum soil pH. |
| phmin | float64 | [pH] | Absolute minimum soil pH. |
| phmax | float64 | [pH] | Absolute maximum soil pH. |
| latopmn | float64 | degree | Optimal minimum latitude, absolute value in degrees from the equator. |
| latopmx | float64 | degree | Optimal maximum latitude, degrees from the equator. |
| latmn | float64 | degree | Absolute minimum latitude, degrees from the equator. A few source rows exceed 90 and are errors. |
| latmx | float64 | degree | Absolute maximum latitude, degrees from the equator. A few source rows exceed 90 and are errors. |
| altmx | int64 | m | Absolute maximum altitude. |
| liopmn | string | — | Optimal minimum light intensity: very bright, clear skies, cloudy skies, light shade, heavy shade. |
| liopmx | string | — | Optimal maximum light intensity, same classes as liopmn. |
| limn | string | — | Absolute minimum light intensity, same classes as liopmn. |
| limx | string | — | Absolute maximum light intensity, same classes as liopmn. |
| photo | array | — | Photoperiod sensitivity: short day (<12 hours), neutral day (12-14 hours), long day (>14 hours). List of strings. |
| cliz | array | — | Climate zones where the species is grown, Köppen-style labels as published, e.g. tropical wet & dry (Aw), subtropical humid (Cf). List of strings. |
| dep | string | — | Optimal soil depth: very shallow (<20 cm), shallow (20-50 cm), medium (50-150 cm), deep (>>150 cm). |
| depr | string | — | Absolute soil depth, same classes as dep. |
| text | array | — | Optimal soil texture: heavy, medium, light, organic, wide. List of strings. |
| textr | array | — | Absolute soil texture, same classes as text. List of strings. |
| fer | string | — | Optimal soil fertility: high, moderate, low. |
| ferr | string | — | Absolute soil fertility, same classes as fer. |
| tox | string | — | Optimal soil aluminium toxicity as share of cation exchange capacity: none (<5%), low (6-15%), medium (16-25%), high (>25%). Mostly empty. |
| toxr | string | — | Absolute soil aluminium toxicity, same classes as tox. |
| sal | string | — | Optimal soil salinity: none, low (<4 dS/m), medium (4-10 dS/m), high (>10 dS/m). |
| salr | string | — | Absolute soil salinity, same classes as sal. |
| dra | array | — | Optimal soil drainage: well (dry spells), poorly (saturated >50% of year), excessive (dry/moderately dry). List of strings. |
| drar | array | — | Absolute soil drainage, same classes as dra. List of strings. |
| abitol | array | — | Abiotic tolerances: drought, flooding, fire, wind, salinity, frost, and others. List of strings. |
| abisus | array | — | Abiotic susceptibilities, same classes as abitol. List of strings. |
| intri | array | — | Introduction risk: can become a weed, poisonous to man or animals, susceptible to nematodes, and others. List of strings. |
Dimensions
EcoPort species code, the EcoCrop primary key. One row per species. The FAO datasheet for a code is https://ecocrop.apps.fao.org/ecocrop/srv/en/dataSheet?id=<ecoportcode>.
Type: integer
Coded against: https://ecocrop.apps.fao.org/ecocrop/srv/en/home
Provenance
Ordered processing steps, from source to publication.
- source
FAO EcoCrop database as exported to CSV in the OpenCLIM EcoCrop suitability model repository (2,568 species, 55 columns, Windows-1252 encoded, missing values as "NA" or empty). FAO no longer offers a bulk download, so the copy pinned at commit ea43ecd is the reference source. Checked against the live FAO tool on 2026-10-09: same species set, IDs, names and values.
- clean2026-10-09
Decoded from Windows-1252 to UTF-8, column names lowercased, "NA" and empty strings set to null, numeric columns typed, multi-valued columns split on commas (outside parentheses for synonyms and common names) into list<string>, values trimmed. No rows dropped or values corrected. Written as one Parquet file sorted by ecoportcode.
How to cite
Please cite the dataset and any associated peer-reviewed publications.
Food and Agriculture Organization of the United Nations (2025) ECOCROP, the crop ecological requirements database. Version 1. https://data.apps.fao.org/catalog/dataset/ecocrop. Accessed through the CGIAR Climate Action Data Hub, https://cgiar-climate-data-hub.github.io/catalog/ecocrop_1/.
BibTeX
@misc{ecocrop_2025,
title = {ECOCROP, the crop ecological requirements database},
author = {{Food and Agriculture Organization of the United Nations}},
year = {2025},
version = {1},
url = {https://data.apps.fao.org/catalog/dataset/ecocrop},
note = {Accessed through the CGIAR Climate Action Data Hub, https://cgiar-climate-data-hub.github.io/catalog/ecocrop_1/}
}Attribution
Reproduce this credit line wherever you reuse the data.
Source data from the FAO EcoCrop database, Food and Agriculture Organization of the United Nations.
Contacts
Who produced this dataset, and who to reach about it.