2026-04-09
- Read Kerchunk datasets with cfdm.read (#385)
- Read open file handle datasets with cfdm.read (#401)
- Write UGRID datasets with cfdm.write (#271)
- New keyword to cfdm.read:
filesystem(#397) - New keyword parameter to cfdm.Data.compute:
persist(#389) - New function to control the persistence of computed data: cfdm.persist_data (#389)
- Support for HEALPix grids (#370)
- New default backend for netCDF-4 in cfdm.write:
h5netcdf-h5py, that allows control of the internal file metadata via the newh5py_optionsparameter (#386) - New default backend for netCDF-4 in cfdm.read that allows parallel
reading:
h5netcdf-pyfive(#375) - New optional backend for netCDF-3 in cfdm.read that allows
parallel reading:
netcdf_file(#375) - Fix bug in cfdm.netcdf_indexer that sometimes caused a failure with a np.newaxis index (#395)
- Fix bug in cfdm.read that wouldn't read non-Zarr and Zarr datasets from the same directory (#391)
- Fix bug in cfdm.write to correctly create unlimited aggregation dimensions that correspond to unlimited normal dimensions (#387)
- Fix bug in cfdm.write when writing identical coordinates that have
different
formula_terms(#380). - New dependency:
pyfive>=1.1.1 - New dependency:
fsspec>=2026.2.0 - Changed dependency:
h5netcdf>=1.8.0 - Removed dependency:
s3fs
2026-01-15
- Write Zarr v3 datasets with cfdm.write, and allow the reading of grouped Zarr v2 and v3 datasets with cfdm.read (#354)
- Read Zarr v2 and v3 datasets that contain a group hierarchy with cfdm.read (#355)
- New function cfdm.dataset_flatten that replaces the deprecated cfdm.netcdf_flatten (#355)
- Raise IndexError for out-of-range indices in a value-setting operation on a data array (#377)
- New function to control the creation of cached elements during data display: cfdm.display_data (#363)
- New methods: cfdm.Data.get_cached_elements, cfdm.Data.cache_elements (#363)
- Set cached elements during cfdm.Data.__init__ (#363)
- Removed the cfdm.constants.CONSTANTS dictionary, replacing it with cfdm.ConstantAccess.constants (#361)
- Reduce the time taken to import cfdm (#361)
- New optional dependency:
zarr>=3.1.3 - Removed dependency (now optional):
zarr
2025-10-15
- Python 3.9 support removed (#353)
- When changing array data type, retain cached data elements cast to the new type (#358)
- Fix bug that prevented cfdm.read from reading a file with
#characters in its file name (#356) - Changed dependency:
Python>=3.10.0
2025-08-18
- Fix cfdm.Data.reshape when the underlying data originate on disk (#348)
- New keyword parameter to cfdm.Field.dump:
data(#345) - New dependency:
distributed>=2025.5.1
2025-06-05
- Implement lossy compression via quantization (#330)
- New quantization classes: cfdm.Quantization, cfdm.mixin.QuantizationMixin (#330)
- New quantization methods: cfdm.Field.get_quantization, cfdm.Field.get_quantize_on_write, cfdm.Field.set_quantize_on_write, cfdm.Field.del_quantize_on_write (#330)
- Improve performance in cfdm.read by caching any array values retrieved from disk (#313)
- New keyword parameter to cfdm.write:
chunk_cache(#328) - Read Zarr v2 and v3 datasets with cfdm.read (#335)
- Read multiple datasets simultaneously with cfdm.read (#336)
- New keyword parameters to cfdm.read:
recursive,followlinks(#336) - New keyword parameters to cfdm.read:
cdl_string(#337) - Update CF aggregation keywords (#341)
- Set new minimum version of dask:
2025.5.1(#339) - New dependency:
zarr>=3.0.8 - Changed dependency:
dask>=2025.5.1
2025-04-01
- Set new method cfdm.Array.astype (#331)
- Set new maximum version of dask:
2025.3.0(#332) - Changed dependency:
dask>=2025.2.0,<=2025.3.0
2025-03-18
- Set new minimum version of dask:
2025.2.0(#321) - Set new minimum version of numpy:
2.0.0(#318) - Introduction of reading and writing of aggregation datasets (for CF-1.13) (#319)
- Changed dependency:
Python>=3.9.0 - Changed dependency:
numpy>=2.0.0 - Changed dependency:
netCDF4>=1.7.2 - Changed dependency:
cftime>=1.6.4 - Changed dependency:
dask>=2025.2.0
2025-02-26
- Re-introduction of cfdm.Data.datetime_as_string (#324)
2025-01-28
- Introduction of dask for all data manipulations (#317)
- Fix bug that returned incorrect results when an invalid identifier is provided to cf.Field.cell_methods (#299)
- Upgrades to allow cfdm to work with Python 3.12 (#302)
- Extension to the HDF5 chunks API (#309)
- New function cfdm.netcdf_flattener that replaces the import of netcdf_flattener (#286)
- New function cfdm.netcdf_indexer that applies netCDF masking and unpacking to arbitrary arrays (#285)
- Allow access to netCDF-4 files in S3 object stores (#285)
- Allow a choice of netCDF engines (#285)
- Fix bug that caused cfdm.write to fail when a parametric Z
dimension coordinate did not have a
computed_standard_nameattribute (#303) - Fix bug that caused cfdm.read to fail to read at all datasets including variables with badly-encoded UGRID meshes (#315)
- New class cfdm.H5netcdfArray
- New class cfdm.NetCDF4Array
- New dependency:
h5netcdf>=1.3.0 - New dependency:
h5py>=3.12.1 - New dependency:
s3fs>=2024.6.0 - New dependency:
dask>=2024.6.0,<=2024.7.1 - New dependency:
uritools>=4.0.3 - New dependency:
cfunits>=3.3.7 - New dependency:
udunits2>=2.2.28 - Removed dependency(now incorporated into cfdm):
netcdf_flattener
2024-03-01
- New keyword parameter to cfdm.Field.insert_dimension:
constructs(#287) - New example field 11: discrete sampling geometry trajectory features (#289)
2023-12-06
- Python 3.7 support removed (#274)
- Implemented the reading and manipulation of UGRID mesh topologies for CF-1.11 (#270)
- New methods: cfdm.Field.cell_connectivity, cfdm.Field.cell_connectivities
- New methods: cfdm.Field.domain_topology, cfdm.Field.domain_topologies
- New methods: cfdm.Field.del_mesh_id, cfdm.Field.get_mesh_id, cfdm.Field.has_mesh_id, cfdm.Field.set_mesh_id,
- New attribute: cfdm.Data.sparse_array
- New dependency:
scipy>=1.10.0
2023-08-31
2023-07-21
- Fix bug that caused very slow reads of datasets with compression by gathering or DSG ragged arrays (#260)
- Fix bug that prevented cfdm.read from accessing remote files in URL locations (#262)
2023-04-26
- New method: cfdm.Data.get_data
- Changes to facilitate CFA-netCDF in cf-python (#255)
- cfdm.read now always returns unicode strings from netCDF files (#251)
- Fix bug in cf.Data.second_element for some data shapes (#249)
- Fix bug when writing to disk coordinates with a
computed_standard_name(#254)
2023-03-10
- New method: cfdm.Field.del_properties (#241)
- New keyword parameter to cfdm.unique_constructs:
ignore_properties(#240) - New keyword parameter to cfdm.NetCDFArray:
missing_values(#246) - Fixed bug that caused cf.write to erroneously change external netCDF variable names (#244)
2023-01-26
- New class: cfdm.InterpolationSubarray (#228)
- Relocate the call to NetCDFRead._customize_read_vars to earlier in NetCDFRead.read (#233)
- Fixed bug that caused incorrect formula terms in output netCDF files in some cases (#242)
2022-10-31
- New method: cfdm.Data.get_tie_point_indices
- New method: cfdm.Data.get_interpolation_parameters
- New method: cfdm.Data.get_dependent_tie_points
- Record the names of files that contain the original data (#215)
- New method: cfdm.Field.get_original_filenames
- New method: cfdm.Data.get_original_filenames
- New keyword parameter to cfdm.write:
omit_data(#221) - Fixed bug that caused incorrect data assignment with some multiple list indices (#217)
- Fixed bug that caused a failure when printing date-time data with the first element masked (#211)
2022-08-17
- New method: cfdm.Field.auxiliary_coordinate
- New method: cfdm.Field.cell_measure
- New method: cfdm.Field.cell_method
- New method: cfdm.Field.coordinate
- New method: cfdm.Field.coordinate_reference
- New method: cfdm.Field.dimension_coordinate
- New method: cfdm.Field.domain_ancillary
- New method: cfdm.Field.domain_axis
- New method: cfdm.Field.field_ancillary
- New method: cfdm.Field.indices
- New attribute: cfdm.Field.array
- New attribute: cfdm.Field.datetime_array
- New construct retrieval API methods (#179)
- Implement (bar writing to netCDF files) lossy compression by coordinate subsampling (#167)
2022-07-18
- Upgrade to allow cfdm to work with Python 3.10 (#187)
- Fix bug that caused a hang when reading zero-length files (#190)
- Fix bug to prevent error when writing vlen strings to a netCDF file when compression has been set (for netCDF4>=1.6.0) (#199)
2022-03-10
- Fixed bug that caused a failure from cfdm.write when writing identical (auxiliary) coordinates to different data variables in different groups (#177)
- Fixed bug that caused cf.Domain.__str__ to fail when a dimension coordinate construct does not have data (#174)
- New dependency:
packaging>=20.0 - Changed dependency:
cftime>=1.6.0
2022-01-31
- Fixed bug that caused a cfdm.write failure when a vertical coordinate reference construct has no coordinates (#164)
- Fixed bug that caused a failure when downstream identities methods return an itertools.chain object (#170)
2021-10-12
- Fixed bug that prevented some geometry coordinates being written to netCDF CLASSIC files (#140)
- Fixed bug that a caused segmentation fault when appending a string data type to netCDF files (#155)
- Fixed bug in cf.Field.get_domain when there are climatological time axes (#159)
2021-09-21
- Python 3.6 support removed (#139)
- Conversion of cfdm.Domain to a non-abstract that may be read from and written to a netCDF dataset (#111)
- New method: cfdm.Domain.creation_commands
- New method: cfdm.Domain.climatological_time_axes
- New method: cfdm.AuxiliaryCoordinate.del_climatology
- New method: cfdm.AuxiliaryCoordinate.get_climatology
- New method: cfdm.AuxiliaryCoordinate.is_climatology
- New method: cfdm.AuxiliaryCoordinate.set_climatology
- New method: cfdm.DimensionCoordinate.del_climatology
- New method: cfdm.DimensionCoordinate.get_climatology
- New method: cfdm.DimensionCoordinate.is_climatology
- New method: cfdm.DimensionCoordinate.set_climatology
- New function: cfdm.unique_constructs
- New function: cfdm.example_fields
- Construct access API changes from 1.8.9.0 applied to Field.convert
- Improved error message for invalid inputs to Field.convert
- Raise exception when attempting to write multiply defined coordinate reference parameters (#148)
- Interpret format specifiers for size 1 cfdm.Data arrays (#152)
- Fix file name expansions in cfdm.write (#157)
2021-05-25
- Construct access API changes (#124, #130, #132, #137)
- Performance enhancements (#124, #130)
- New write mode
mode='a'for appending to, rather than over-writing, a netCDF file on disk (#143) - Better error message in the case of a numpy.ma.core.MaskError occurring upon reading of CDL files with only header or coordinate information (#128)
- Fix for zero-sized unlimited dimensions when read from a grouped netCDF file (#113)
- Fix bug causing occasional non-symmetric equals operations (#133)
- Changed dependency:
cftime>=1.5.0 - Changed dependency:
netCDF4>=1.5.4
2020-12-18
- The setting of global constants can now be controlled by a context manager (#100)
- Fixed bug that caused a failure when writing a dataset that contains a scalar domain ancillary construct (#98)
- Changed dependency:
cftime>=1.3.0
2020-10-09
- Python 3.5 support deprecated (3.5 was retired on 2020-09-13)
- New method: cfdm.Field.creation_commands
- New method: cfdm.Data.creation_commands
- New method: cfdm.Field._docstring_special_substitutions
- New method: cfdm.Field._docstring_substitutions
- New method: cfdm.Field._docstring_package_depth
- New method: cfdm.Field._docstring_method_exclusions
- New method: cfdm.Data.filled
- New keyword parameter to cfdm.Field.set_data:
inplace - New keyword parameter to cfdm.write:
coordinates(#81) - New class: cfdm.core.DocstringRewriteMeta
- Comprehensive documentation coverage of class methods.
- Improved documentation following JOSS review.
- Enabled "creation commands" methods (#53)
- Fixed bug that caused failures when reading or writing a dataset that contains multiple geometry containers (#65)
- Fixed bug that prevented the writing of multiple fields to netCDF when at least one dimension was shared between some of the fields.
2020-07-24
- Removed Python 2.7 support (#55)
- Implemented the reading and writing of netCDF4 group hierarchies for CF-1.8 (#13)
- Renamed to lower-case (but otherwise identical) names all functions which get and set global constants: cfdm.atol, cfdm.rtol, cfdm.log_level. The old names e.g. cfdm.ATOL remain functional as aliases.
- New function: cfdm.configuration
- New method: cfdm.Field.nc_variable_groups
- New method: cfdm.Field.nc_set_variable_groups
- New method: cfdm.Field.nc_clear_variable_groups
- New method: cfdm.Field.nc_group_attributes
- New method: cfdm.Field.nc_set_group_attribute
- New method: cfdm.Field.nc_set_group_attributes
- New method: cfdm.Field.nc_clear_group_attributes
- New method: cfdm.Field.nc_geometry_variable_groups
- New method: cfdm.Field.nc_set_geometry_variable_groups
- New method: cfdm.Field.nc_clear_geometry_variable_groups
- New method: cfdm.DomainAxis.nc_dimension_groups
- New method: cfdm.DomainAxis.nc_set_dimension_groups
- New method: cfdm.DomainAxis.nc_clear_dimension_groups
- New method: cfdm.AuxiliaryCoordinate.del_interior_ring
- New keyword parameter to cfdm.write:
group - Keyword parameter
verboseto multiple methods now accepts named strings, not just the equivalent integer levels, to set verbosity. - Added test to check that cell bounds have more dimensions than the data.
- Added test to check that dimension coordinate construct data is 1-dimensional.
- Fixed bug in cfdm.CompressedArray.to_memory.
- Fixed bug that caused an error when a coordinate bounds variable is missing from a dataset (#63)
- New dependency:
netcdf_flattener>=1.2.0 - Changed dependency:
cftime>=1.2.1 - Removed dependency:
future
2020-06-10
- Fixed bug that prevented the reading of certain netCDF files, such as those with at least one external variable.
2020-06-08
- Added new example field
7to cfdm.example_field. - Enabled configuration of the extent and nature of informational and warning messages output by cfdm using a logging framework (see points below) (#31)
- New function cfdm.LOG_LEVEL to set the minimum log level for which messages are displayed globally, i.e. to change the project-wide verbosity (#35).
- Changed behaviour and default of verbose keyword argument when available to a function/method so it interfaces with the new logging functionality (#35).
- Changed dependency:
cftime>=1.1.3 - Fixed bug the wouldn't allow the reading of a netCDF file which specifies Conventions other than CF (#36).
2020-04-30
- cfdm.Field.apply_masking now masks metadata constructs.
- New method: cfdm.Field.get_filenames
- New method: cfdm.Data.get_filenames
- New function: cfdm.abspath
- New keyword parameter to cfdm.read:
warn_valid(#30) - New keyword parameter to cfdm.write:
warn_valid(#30)
2020-04-24
- Added time coordinate bounds to the polygon geometry example field
6returned by cfdm.example_field. - New method: cfdm.Field.apply_masking
- New method: cfdm.Data.apply_masking
- New keyword parameter to cfdm.read:
mask - New keyword parameter to cfdm.Field.nc_global_attributes:
values - Fixed bug in cfdm.write that caused (what are effectively) string-valued scalar auxiliary coordinates to not be written to disk as such, or even an exception to be raised.
2020-04-16
- Improved source code highlighting in links from the documentation (#21).
- Fixed bug that erroneously required netCDF geometry container
variables to have a
geometry_dimensionnetCDF attribute.
2020-03-23
- First release for CF-1.8 (does not include netCDF hierarchical groups functionality).
- Implementation of simple geometries for CF-1.8 (#11).
- Implementing of string data-types for CF-1.8 (#12).
- New function: cfdm.example_field (#18)
- New attributes: cfdm.Field.dtype, cfdm.Field.ndim, cfdm.Field.shape, cfdm.Field.size
- New method: cfdm.Data.any
- New
pathskeyword parameter to cfdm.environment - Changed dependency:
netCDF4>=1.5.3 - Changed dependency:
cftime>=1.1.1 - Fixed bug that prevented the writing of
'NETCDF3_64BIT_OFFSET'and'NETCDF3_64BIT_DATA'format files (#9). - Fixed bug that caused a failure when a "_FillValue" or
"missing_value" property is set and data type conversions are
specified with the
datatypekeyword to cfdm.write (#16). - Fixed bug whereby cfdm.Field.has_construct would try to delete the construct rather than check whether it existed.
2019-11-27
- New methods: cfdm.Field.compress, cfdm.Field.uncompress
- New methods: cfdm.Data.flatten, cfdm.Data.uncompress
- New
dtypeandmaskkeyword parameters to cfdm.Data - Changed the default value of the
ignore_compressionparameter to True.
2019-11-14
- New method: cfdm.Field.nc_set_global_attributes.
- Fixed bug relating to the reading of some CDL files (#5).
- Fixed bug relating numpy warning when printing a field with masked reference time values (#8).
2019-11-07
- Fixed bug relating to setting of parameters on datum and coordinate conversion objects of coordinate conversion constructs (#6).
2019-10-04
- During writing to netCDF files, ensured that _FillValue and missing_value have the same data type as the data.
- Fixed bug during construct equality testing that didn't recognise equal cell method constructs in transposed, but otherwise equal field constructs.
- Bounds netCDF dimension name is now saved, and can be set. The saved/set value is written out to disk.
- Now reads CDL files (#5)
2019-06-13
- Don't set the fill mode for a netCDF4.Dataset open for writing to off, to prevent incorrect reading of some netCDF4 files (#4).
- Updated documentation
2019-06-05
- Added attributes _ATOL and _RTOL to facilitate subclassing.
- Fixed bug in cfdm.Field.convert.
- Fixed bug in cfdm.core.constructs.new_identifier.
2019-05-15
- New methods: Datum.nc_has_variable, Datum.nc_get_variable, Datum.nc_has_variable, Datum.nc_set_variable (#3).
2019-05-14
- Changed behaviour of cfdm.Constructs.filter_by_axis.
- New methods: cfdm.Data.has_units, cfdm.Data.has_calendar, cfdm.Data.has_fill_value.
- New
constructskeyword parameter to Field.transpose. - Keyword parameter
axesto cfdm.Field.set_data is now optional. - Added the 'has_bounds' method to constructs that have data but can't have bounds.
- New methods: cfdm.DomainAxis.nc_is_unlimited, cfdm.DomainAxis.nc_set_unlimited.
- Made Data a virtual subclass of Array.
- Deprecated methods: cfdm.Field.nc_unlimited, cfdm.Field.nc_clear_unlimited, cfdm.Field.nc_clear_unlimited.
- Fixed bug when writing new horizontal coordinate reference for the vertical datum.
- Fixed bug in del_data methods.
- Fixed bug with in-place operations.
- Fixed bug with position in some insert_dimension methods.
- Fixed bug that sometimes made duplicate netCDF dimensions when writing to a file.
- Added _shape keyword to cfdm.Field.set_data_axes to allow the data shape to be checked prior to insertion.
- Added the '_custom' attribute to facilitate subclassing.
- New class cfdm.mixin.NetCDFUnlimitedDimension replaces cfdm.mixin.NetCDFUnlimitedDimensions, which is deprecated.
- New method cfdm.CFDMImplementation.nc_is_unlimited_axis replaces cfdm.CFDMImplementation.nc_get_unlimited_axes, which is deprecated.
- New method cfdm.CFDMImplementation.nc_set_unlimited_axis replaces cfdm.CFDMImplementation.nc_set_unlimited_dimensions, which is deprecated.
2019-04-24
- New method: cfdm.Constructs.filter_by_size.
- New method: cfdm.Data.uncompress.
- Changed the default behaviours of the cfdm.Construct.filter_by_axis, cfdm.Construct.filter_by_size, cfdm.Construct.filter_by_naxes, cfdm.Construct.filter_by_property, cfdm.Construct.filter_by_ncvar, cfdm.Construct.filter_by_ncdim, cfdm.Construct.filter_by_method, cfdm.Construct.filter_by_measure methods in the case when no arguments are provided: Now returns all possible constructs that could have the feature, with any values.
- Renamed the "underlying_array" methods to "source"
- Added _field_data_axes attribute to Constructs instances.
- Added _units and _fill_value arguments to get_data method.
- Moved contents of cfdm/read_write/constants.py to NetCDFRead and NetCDFWrite.
- Fixed bug in cfdm.CoordinateReference.clear_coordinates.
- Fixed bug in cfdm.Field.convert (which omitted domain ancillaries in the result).
- Added
kwargsparameter to cfdm.CFDMImplementation.initialise_Data, to facilitate subclassing. - Added NetCDFRead._customize_read_vars to facilitate subclassing.
- Added NetCDFWrite._transform_strings to facilitate subclassing.
2019-04-05
- New
modeparameter options to cfdm.Constructs.filter_by_axis:'exact','subset','superset'. - Enabled setting of HDF5 chunksizes.
- Fixed bug that caused coordinate bounds to be not sliced during subspacing (#1).
2019-04-02
- New methods cfdm.Constructs.clear_filters_applied, cfdm.Constructs.filter_by_naxes.
- Changed behaviour of cfdm.Constructs.unfilter and cfdm.Constructs.inverse_filters: added depth keyword and changed default.
2019-04-02
- First release for CF-1.7