CF Conventions Module#
The cf module provides shared infrastructure for reading and writing
CF (Climate and Forecast) convention attributes. It is used by both the
structured NetCDF class and the unstructured UgridDataset class.
Key Capabilities#
- Variable classification: Detect coordinate, data, mesh topology,
and connectivity variables via
classify_variables() - CRS handling: Convert between CF
grid_mappingattributes and OGRSpatialReferenceviagrid_mapping_to_srs()/srs_to_grid_mapping() - Attribute writing: Write CF-compliant attributes to GDAL MDArrays and root groups
- Axis detection: Identify X/Y/Z/T axes from variable names, attributes, and units
- Convention parsing: Parse
Conventionsattribute strings (e.g.,"CF-1.8 UGRID-1.0") - Data masking: Apply
valid_range,valid_min,valid_maxmasks - Flag decoding: Decode CF
flag_values/flag_meanings
Capability map#
The cf module is a flat collection of helpers (no classes) shared by the structured NetCDF reader
and the unstructured UgridDataset. They group into five roles — classification, CRS translation,
convention parsing, attribute writing, and value decoding/validation:
flowchart TB
NC["NetCDF"] --> CF
UG["UgridDataset"] --> CF
subgraph CF["cf module"]
direction TB
CLS["classify_variables()<br/>data · coordinate · grid_mapping · bounds<br/>mesh_topology · connectivity · …"]
CRS["grid_mapping_to_srs() ⇄ srs_to_grid_mapping()"]
PAR["detect_axis() · parse_conventions()<br/>parse_cell_methods()"]
WR["write_attributes_to_md_array()<br/>write_global_attributes()<br/>build_coordinate_attrs()"]
DEC["apply_valid_range_mask() · decode_flags()<br/>validate_cf()"]
end
API Reference#
pyramids.netcdf.cf.classify_variables(variables, dimensions)
#
Classify each variable's CF role by cross-referencing attributes.
Must be called AFTER all variables are collected.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
variables
|
dict[str, Any]
|
Dict of |
required |
dimensions
|
dict[str, Any]
|
Dict of |
required |
Returns:
| Type | Description |
|---|---|
dict[str, str]
|
Dict of |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.grid_mapping_to_srs(grid_mapping_name, params)
#
Convert CF grid_mapping attributes to an OGR SpatialReference.
Tries crs_wkt first (fast path). Falls back to reconstructing
the SRS from individual CF parameters.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
grid_mapping_name
|
str
|
CF |
required |
params
|
dict[str, Any]
|
All attributes from the grid_mapping variable. |
required |
Returns:
| Type | Description |
|---|---|
SpatialReference
|
osr.SpatialReference: The reconstructed spatial reference. |
Raises:
| Type | Description |
|---|---|
ValueError
|
If the grid_mapping_name is not supported and
no |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.srs_to_grid_mapping(srs)
#
Convert an OGR SpatialReference to CF grid_mapping name and params.
Returns the CF grid_mapping_name and a dict of CF projection
parameters (including crs_wkt for interoperability). For
geographic CRS (no projection), returns "latitude_longitude"
with only ellipsoid parameters.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
srs
|
SpatialReference
|
An OGR SpatialReference object. |
required |
Returns:
| Type | Description |
|---|---|
tuple[str, dict[str, Any]]
|
Tuple of |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.write_attributes_to_md_array(md_arr, attrs)
#
Write a dict of attributes to a GDAL MDArray.
Handles str, bool, int, float, and list values. Silently skips attributes that can't be written (GDAL limitation). Bool values are stored as int32 (1/0) since NetCDF has no boolean type.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
md_arr
|
MDArray
|
The GDAL MDArray to write attributes to. |
required |
attrs
|
dict[str, Any]
|
Dict of attribute names to values. |
required |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.write_global_attributes(rg, attrs)
#
Write a dict of attributes to a GDAL root group.
Handles str, bool, int, float values. Bool values are stored as int32. Silently skips attributes that can't be written.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
rg
|
Group
|
The GDAL root group to write attributes to. |
required |
attrs
|
dict[str, Any]
|
Dict of attribute names to values. |
required |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.build_coordinate_attrs(dim_name, is_geographic=True)
#
Generate CF-compliant attributes for a coordinate variable.
Maps dimension names to the appropriate CF axis,
standard_name, long_name, and units attributes
based on whether the CRS is geographic or projected.
Dimension names are case-normalized (lowered) before
matching, so "X", "x", and "Lon" all match the
X-axis pattern.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dim_name
|
str
|
Dimension name (e.g. |
required |
is_geographic
|
bool
|
True if the CRS is geographic (lon/lat), False if projected (easting/northing in metres). |
True
|
Returns:
| Type | Description |
|---|---|
dict[str, str]
|
Dict of CF attribute names to string values. Empty dict |
dict[str, str]
|
if the dimension name is not recognized. |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.detect_axis(name, attrs, units=None)
#
Detect CF axis type from a variable's attributes.
Applies heuristics in priority order:
1. Explicit axis attribute ("X", "Y", "Z", "T")
2. standard_name lookup against CF conventions
3. Unit string matching (degrees_north -> Y, etc.)
4. Variable name pattern matching (lat -> Y, lon -> X)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Variable or dimension short name. |
required |
attrs
|
dict[str, Any]
|
Variable attribute dictionary. Attribute names are matched
case-insensitively ( |
required |
units
|
str | None
|
Unit string (separate from attrs for flexibility). |
None
|
Returns:
| Type | Description |
|---|---|
str | None
|
One of |
Examples:
- An explicit
axisattribute wins over everything else: - A
standard_nameis matched against the CF table: - A
unitsstring of the form<period> since <epoch>marks a time axis: - With no attributes, the variable name is matched by pattern:
- Attribute names are matched case-insensitively, so capitalized keys
(e.g.
Axis) still classify the coordinate: - An unrecognized name with no usable attributes returns
None:
Source code in src/pyramids/netcdf/cf.py
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 | |
pyramids.netcdf.cf.parse_conventions(conventions_str)
#
Parse a Conventions global attribute string.
Logs a warning if the CF version is higher than the highest
tested version (1.11).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
conventions_str
|
str | None
|
Space-separated conventions string, e.g.
|
required |
Returns:
| Type | Description |
|---|---|
dict[str, str]
|
Dict of |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.parse_cell_methods(cell_methods_str)
#
Parse a CF cell_methods attribute string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cell_methods_str
|
str
|
CF cell_methods string, e.g.
|
required |
Returns:
| Type | Description |
|---|---|
list[dict[str, str]]
|
List of dicts with keys |
list[dict[str, str]]
|
and optionally |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.apply_valid_range_mask(arr, valid_min=None, valid_max=None, valid_range=None, fill_value=float('nan'))
#
Mask values outside the CF valid range.
Values below valid_min or above valid_max are replaced
with fill_value.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
arr
|
Any
|
Input numpy array. |
required |
valid_min
|
float | None
|
Minimum valid value. |
None
|
valid_max
|
float | None
|
Maximum valid value. |
None
|
valid_range
|
tuple | list | None
|
|
None
|
fill_value
|
float
|
Replacement value. Defaults to NaN. |
float('nan')
|
Returns:
| Type | Description |
|---|---|
Any
|
A copy of |
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.decode_flags(value, flag_values=None, flag_meanings=None, flag_masks=None)
#
Decode a CF flag value to human-readable label(s).
Supports three CF flag modes:
- Mutually exclusive (flag_values + flag_meanings): Returns the single meaning matching the value.
- Boolean / bit-field (flag_masks + flag_meanings): Returns a list of meanings for active bits.
- Combined (flag_masks + flag_values + flag_meanings):
Returns meanings where
(value & mask) == flag_value.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
int
|
The integer flag value to decode. |
required |
flag_values
|
list | None
|
List of possible flag values (1:1 with meanings). |
None
|
flag_meanings
|
list[str] | None
|
List of human-readable meaning strings. |
None
|
flag_masks
|
list[int] | None
|
List of bit masks for boolean flags. |
None
|
Returns:
| Type | Description |
|---|---|
list[str]
|
list[str]: List of matching meaning strings. Returns |
list[str]
|
|
Source code in src/pyramids/netcdf/cf.py
pyramids.netcdf.cf.validate_cf(global_attrs, variables, dimensions)
#
Check for common CF compliance issues.
Returns a list of warning/error messages. An empty list means the dataset passes basic CF checks. This is NOT a full cfchecker replacement — it covers the most common issues.
Checks:
1. Conventions attribute present and contains "CF-"
2. Coordinate variables have units
3. Time coordinates have calendar
Limitation: Only checks dimension-coordinate variables (those
whose name matches a dimension). Auxiliary coordinates referenced
by the coordinates attribute on data variables are not
validated.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
global_attrs
|
dict[str, Any]
|
Root-level attributes dict. |
required |
variables
|
dict[str, Any]
|
Dict of |
required |
dimensions
|
dict[str, Any]
|
Dict of |
required |
Returns:
| Type | Description |
|---|---|
list[str]
|
List of warning/error strings. Empty if compliant. |