Releases: xCDAT/xcdat
v0.10.1
v0.10.1 (01 October 2025)
This patch release introduces bug fixes, documentation updates, and DevOps changes, including constraining cf_xarray >=0.10.7, preserving Xarray legacy behaviors for open_mfdataset() with compat and join arguments to prevent unexpected breaking changes for users, dropping Python 3.10 support, and adding PyAOS to the endorsements list.
Bug Fixes
- Constrain
cf_xarray >=0.10.7by @tomvothecoder in #804. This constraint is necessary becausecf_xarray=0.10.7introduces a fix tobounds_to_vertices(), enabling support for non-monotonic bounds and propagating correct regridding results in xESMF for such cases (refer to xarray-contrib/cf-xarray#579).
Documentation
- Add PyAOS to list of endorsements by @tomvothecoder in #802
DevOps
- Preserve Xarray legacy
compatandjoinbehaviors by @tomvothecoder in #800. This change was made to maintain consistent functionality across environments after Xarray updates, preventing unexpected breaking changes for downstream users. - Drop Python 3.10 support by @tomvothecoder in #794
Full Changelog: v0.10.0...v0.10.1
v0.10.0
v0.10.0 (27 Aug 2025)
This release introduces a new weight threshold option for temporal operations, improves regridding alignment, and fixes multiple issues with xgcm.Grid and xESMF integration. It also includes a DevOps fix to maintain consistency in handling xgcm.Grid metadata.
Enhancements
- Add weight threshold option for temporal operations by @tomvothecoder in #683
Bug Fixes
- Remove
maskfromcreate_grid()output to prevent xESMF issue by @tomvothecoder in #786 - Fix
xgcm.Griderrors by passingautoparse_metadata=Falseby @tomvothecoder in #785 - Fix regrid2 alignment of output and input dims for final dataarray by @tomvothecoder in #782
Full Changelog: v0.9.1...v0.10.0
v0.9.1
v0.9.1 (08 July 2025)
This patch release includes enhancements to bounds handling, improved error messages, and documentation updates.
Enhancements
- Update
get_bounds_dim()to dynamically get correct dim by @tomvothecoder in #773
Bug Fixes
- Fix
get_bounds()error message by @tomvothecoder in #776
Documentation
- Add
create_mask()andcreate_nan_mask()to API reference page by @tomvothecoder in #774
Full Changelog: v0.9.0...v0.9.1
v0.9.0
v0.9.0 (02 June 2025)
This release introduces key functional and performance enhancements across regridding, averaging, and coordinate handling workflows. Users can now output regridding weights and infer vertical target data, improving flexibility in vertical and horizontal transformations. Time frequency inference logic is more robust through median delta computation, and new options for skipna handling and spatial weight thresholds support more accurate and configurable statistical operations. Additional improvements to coordinate handling enable support for curvilinear grids. The release also includes critical bug fixes, expanded documentation, and updated compatibility for modern Python environments by dropping Python 3.9 and adding compatibility with Python 3.13.
Enhancements
- Adds option to output regridding weights and create mask for regridding by @jasonb5 in #752
- Adds ability to infer target data for vertical regridding by @jasonb5 in #756
- Use the median of the delta instead of min for time freq inference by @chengzhuzhang in #768
- Add weight threshold option for spatial averaging by @pochedls in #672
- Enable
skipnafor spatial and temporal mean operations by @lee1043 in #655 - Enhance coordinate handling and add curvilinear dataset support by @tomvothecoder in #736
Bug Fixes
- Eliminate performance bottleneck in
temporal.group_average()by @will-s-hart in #767 - Fix incorrect dimension used for temporal weights generation by @tomvothecoder in #749
Documentation
- Add
.zenodo.jsonandCITATION.cffto cite core authors by @tomvothecoder in #759 - Replace support section with endorsements by @tomvothecoder in #757
- Add xCDAT tutorial datasets and update gallery notebooks by @tomvothecoder in #705
- Add endorsement section to docs with Xarray, Pangeo, and WCRP by @tomvothecoder in
#741, #742, #757
DevOps
- Make
scipya required dependency by @tomvothecoder in #765 - Drop Python 3.9 support and add compatibility for Python 3.13 by @tomvothecoder in #721
New Contributors
- @will-s-hart made their first contribution in #767
Full Changelog: v0.8.0...v0.9.0
v0.8.0
v0.8.0 (14 February 2025)
This minor release introduces a new feature for temporal averaging with custom seasons spanning the calendar year. It also includes the ability to detect and drop incomplete seasons using the drop_incomplete_season config, which will eventually replace drop_incomplete_djf (previously limited to DJF seasons). Additionally, a bug in the regrid2 regridder has been fixed, ensuring coordinates are now preserved correctly.
Enhancements
- Add support for custom seasons spanning calendar years by @tomvothecoder in #423
Bug Fixes
- Fixes preserving coordinates in regrid2 by @jasonb5 and @tomvothecoder in #716
- Fix
DeprecationWarningandFutureWarningfound in test suite by @tomvothecoder in #724
Documentation
- Replace Miniconda with Miniforge by @tomvothecoder in #727
- Update Miniconda references to Miniforge in HPC docs by @tomvothecoder in #731
DevOps
- Update pre-commit hooks and add ci config by @tomvothecoder in #732
- Fix
DeprecationWarningandFutureWarningfound in test suite by @tomvothecoder in #724
Full Changelog: v0.7.3...v0.8.0
v0.7.3
v0.7.3 (06 November 2024)
This patch release updates the NumPy constraint to numpy >=2.0.0,<3.0.0 to ensure compatibility with NumPy 2.0 (which introduces breaking changes). It also fixes a bug in the get_bounds() method where bounds could not be found on supported non-CF axes (e.g., "latitude", "longitude", etc.) even with the "bounds" attribute set on the axes.
Bug Fixes
- Update
get_bounds()to support mappable non-CF axes using"bounds"attr by @tomvothecoder in #708
Documentation
- Add link to SciPy talk in docs by @tomvothecoder in #704
DevOps
- Adopt
ruffas the central tool for linting, formatting, and import sorting by @tomvothecoder in #702 - Update numpy constraint to
>=2.0.0,<3.0.0by @tomvothecoder and @xylar in #711, #712 - Replace
setup.pywithpyproject.tomlfor modern Python packaging by @tomvothecoder and @xylar in #712
Full Changelog: v0.7.2...v0.7.3
v0.7.2
v0.7.2 (02 October 2024)
This patch release introduces significant performance improvements to the temporal grouping averaging APIs (group_average, climatology, and departures) and adds support for piControl and other simulations that have time coordinates starting at year 1 (e.g., "0001-01-01") when dropping incomplete seasons.
Enhancements
- [Refactor] Improve the performance of temporal group averaging by @tomvothecoder in #689
Bug Fixes
- Update temporal.py to properly handle piControl and other simulations that start at year 1 when dropping incomplete seasons by @lee1043 in #696
Documentation
- Add project logos to README and project overview page on docs by @tomvothecoder in #686
- Add links to JOSS and DOE EESM content by @tomvothecoder in #682
- Add SciPy 2024 talk material by @tomvothecoder in #658, #678, #679, #680
- Add JOSS badge to README by @tomvothecoder in #674
DevOps
- Update
setup.pyclassifiers by @tomvothecoder in #691 - Update build workflow by @tomvothecoder in #698
Full Changelog: v0.7.1...v0.7.2
v0.7.1
v0.7.1 (24 June 2024)
This patch release fixes a bug in the Regrid2 API where a static order of dimensions are incorrectly expected. It updates add_missing_bounds() to convert np.timedelta64 values to pandas.Timedelta objects to support Xarray's datetime component accessor.
This release also includes numerous updates to the documentation, including adding a general guide to parallel computing with Dask notebook (link). It also ensures all existing notebooks and documentation are up to date with the latest and relevant information.
Bug Fixes
- Fixes regrid2 mapping output to input ordering by @jasonb5 in #653
- Update
add_missing_bounds()to convertnp.timedelta64topd.Timedeltato support Xarray's datetime component accessor by @lee1043 in #660
Documentation
- Add JOSS paper by @tomvothecoder in #567
- Add Parallel Computing with Dask Jupyter Notebook by @tomvothecoder in #489
- Update regridding notebook for v0.7.0 by @chengzhuzhang in #646
- Update FAQs, HPC guide, and Gentle Introduction by @tomvothecoder in #650
- Simplify the contributing guide by @tomvothecoder in #593
- Update notebook env setup instructions with kernel by @tomvothecoder in #652
- Add instructions for setting
ESMFMKFILEand update links to xESMF docs by @tomvothecoder in #643 - Temporal average notebooks maintanance by @lee1043 in #633
- Review of spatial averaging and general dataset utilities by @pochedls in #644
Full Changelog: v0.7.0...v0.7.1
v0.7.0
v0.7.0 (10 April 2024)
This minor release includes enhancements to the performance of the Regrid2 API and fixes Regrid2 to align the behavior of how missing values are handled with CDAT. There are various other bug fixes and documentation updates listed below.
Enhancements
- Improving regrid2 performance by @jasonb5 in #533
- Update Regrid2 missing and fill value behaviors to align with CDAT and add
unmapped_to_nanarg for output data by @jasonb5 in #613
Bug Fixes
- Fix Regrid2 to convert bounds as Dask Arrays to NumPy Arrays for compatibility with NumPy based code by @tomvothecoder and @lee1043 in #634
- Fix climo notebook missing T bounds and add notebook env setup in all example notebooks by @tomvothecoder in #623
- Update unweighted temporal averages to not require bounds by @tomvothecoder in #579
Documentation
- Update documentation styling for easier navigation by @tomvothecoder and @pochedls in #624 and #630
- Add list of projects using xCDAT by @tomvothecoder in #617
- [PR]: Update documentation on temporal averaging, usage of bounds, and generation of weights by @tomvothecoder in #601
- Fix ESMFMKFILE env variable not set in RTD build by @tomvothecoder in #577
Deprecations
- Remove deprecated features and APIs by @tomvothecoder in #628, including:
horizontal_xesmf()andhorizontal_regrid2()**kwargsfromcreate_grid()add_boundsaccepting boolean arg inopen_dataset()andopen_mfdataset()- Remove CDML/XML support from
open_dataset()andopen_mfdataset()since CDAT is EOL since Dec/2023
Full Changelog: v0.6.1...0.7.0
v0.6.1
v0.6.1 (29 November 2023)
This patch version adds a default value to the axes argument in ds.bounds.add_missing_bounds() (axes=["X", "Y", "T"]). The axes argument was added in v0.6.0 and did not have a default value, which inadvertently introduced a breaking change to the API.
xesmf is now a required dependency because its core library, ESMF, supports Windows as of Feb/2023. More information can be found here.
Bug Fixes
- Add defaults to add_missing_bounds by @acordonez in #569
DevOps
- Make xESMF a required dependency by @tomvothecoder in #566
Documentation
- Update doc: Add link to the ESFG seminar xCDAT introduction video by @lee1043 in #571
- Fix v0.6.0 changelog headers for proper nesting by @tomvothecoder in #559
Full Changelog: