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.
- Adopt
ruff
as the central tool for linting, formatting, and import sorting by Tom Vo in #702 - Update numpy constraint to
>=2.0.0,<3.0.0
by Tom Vo and Xylar Asay-Davis in #711, #712 - Replace
setup.py
withpyproject.toml
for modern Python packaging by Tom Vo and Xylar Asay-Davis in #712
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.7.2...v0.7.3
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.
- Update temporal.py to properly handle piControl and other simulations that start at year 1 when dropping incomplete seasons by Jiwoo Lee in #696
- Add project logos to README and project overview page on docs by Tom Vo in #686
- Add links to JOSS and DOE EESM content by Tom Vo in #682
- Add SciPy 2024 talk material by Tom Vo in #658, #678, #679, #680
- Add JOSS badge to README by Tom Vo in #674
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.7.1...v0.7.2
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. It also ensures all existing notebooks and documentation are up to date with the latest and relevant information.
- Fixes regrid2 mapping output to input ordering by Jason Boutte in #653
- Update
add_missing_bounds()
to convertnp.timedelta64
topd.Timedelta
to support Xarray's datetime component accessor _Jiwoo Lee in #660
- Add JOSS paper by Tom Vo in #567
- Add Parallel Computing with Dask Jupyter Notebook by Tom Vo in #489
- Update regridding notebook for v0.7.0 by Jill Chengzhu Zhang in #646
- Update FAQs, HPC guide, and Gentle Introduction by Tom Vo in #650
- Simplify the contributing guide by Tom Vo in #593
- Update notebook env setup instructions with kernel by Tom Vo in #652
- Add instructions for setting ESMFMKFILE and update links to xESMF docs by Tom Vo in #643
- Temporal average notebooks maintanance by Jiwoo Lee in #633
- Review of spatial averaging and general dataset utilities by Stephen Po-Chedley in #644
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.7.0...v0.7.1
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 bug fixes, documentation updates, and feature deprecations listed below.
- Improving regrid2 performance by Jason Boutte in #533
- Update Regrid2 missing and fill value behaviors to align with CDAT
and add
unmapped_to_nan
arg for output data by Jason Boutte in #613
- Fix Regrid2 to convert bounds as Dask Arrays to NumPy Arrays for compatibility with NumPy based code by Tom Vo and Jiwoo Lee in #634
- Fix climo notebook missing T bounds and add notebook env setup in all example notebooks by Tom Vo in #623
- Update unweighted temporal averages to not require bounds by Tom Vo in #579
- Update documentation styling for easier navigation by Tom Vo in #624
- Add list of projects using xCDAT by Tom Vo in #617
- Fix ESMFMKFILE env variable not set in RTD build by Tom Vo in #577
- Remove deprecated features and APIs by Tom Vo in
#628, including:
horizontal_xesmf()
andhorizontal_regrid2()
**kwargs
fromcreate_grid()
add_bounds
accepting boolean arg inopen_dataset()
andopen_mfdataset()
- Remove CDML/XML support from
open_dataset()
andopen_mfdataset()
since CDAT is EOL since Dec/2023
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.6.1...v0.7.0
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.
- Add defaults to add_missing_bounds by Ana Ordonez in #569
- Update doc: Add link to the ESFG seminar xCDAT introduction video by Jiwoo Lee in #571
- Fix v0.6.0 changelog headers for proper nesting by Tom Vo in #559
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.6.0...v0.6.1
This minor version update consists of new features including vertical
regridding (extension of xgcm
), functions for producing accurate
time bounds, and improving the usability of the create_grid
API. It
also includes bug fixes to preserve attributes when using regrid2
horizontal regridder and fixing multi-file datasets spatial average
orientation and weights when lon bounds span prime meridian.
- Functions to produce accurate time bounds by Stephen Po-Chedley in #418
- Add API extending xgcm vertical regridding by Jason Boutte in #388, #535, #525
- Update
create_grid
args to improve usability by Jason Boutte in #507, #539
- Add deprecation warnings for
add_bounds
boolean args by Tom Vo in #548, - Add deprecation warning for CDML/XML support in
open_mfdataset()
by Tom Vo in #503, #504
- Improves error when axis is missing/incorrect attributes with regrid2 by Jason Boutte in #481
- Fixes preserving ds/da attributes in the regrid2 module by Jason Boutte in #468
- Fixes duplicate parameter in regrid2 docs by Jason Boutte in #532
- Fix multi-file dataset spatial average orientation and weights when lon bounds span prime meridian by Stephen Po-Chedley in #495
- Typo fix for climatology code example in docs by Jiwoo Lee in #491
- Update documentation in regrid2.py by Jiwoo Lee in #509
- Add more fields to GH Discussions question form by Tom Vo in #480
- Add Q&A GH discussions template by Tom Vo in #479
- Update FAQs question covering datasets with conflicting bounds by Tom Vo in #474
- Add Google Groups mailing list to docs by Tom Vo in #452
- Fix README link to CODE-OF-CONDUCT.rst by Tom Vo in #444
- Replace LLNL E3SM License with xCDAT License by Tom Vo in #443
- Update getting started and HPC documentation by Tom Vo in #553
- Fix Python deprecation comment in conda env yml files by Tom Vo in #514
- Simplify conda environments and move configs to
pyproject.toml
by Tom Vo in #512 - Update DevOps to cache conda and fix attributes not being preserved
with
xarray > 2023.3.0
by Tom Vo in #465 - Update GH Actions to use
mamba
by Tom Vo in #450 - Update constraint
cf_xarray >=0.7.3
to workaround xarray import issue by Tom Vo in #547
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.5.0...v0.6.0
This long-awaited minor release includes feature updates to support an
optional user-specified climatology reference period when calculating
climatologies and departures, support for opening datasets using the
directory
key of the legacy CDAT Climate Data Markup Language
(CDML)
format (an XML dialect), and improved support for using custom time
coordinates in temporal APIs.
This release also includes a bug fix for singleton coordinates breaking
the swap_lon_axis()
function. Additionally, Jupyter Notebooks for
presentations and demos have been added to the documentation.
- Update departures and climatology APIs with reference period by Tom Vo in #417
- Wrap open_dataset and open_mfdataset to flexibly open datasets by Stephen Po-Chedley in #385
- Add better support for using custom time coordinates in temporal APIs by Tom Vo in #415
- Raise warning if no time coords found with
decode_times
by Tom Vo in #409 - Bump conda env dependencies by Tom Vo in #408
- Fix
swap_lon_axis()
breaking when sorting with singleton coords by Tom Vo in #392
- Update xsearch-xcdat-example.ipynb by Stephen Po-Chedley in #425
- Updates xesmf docs by Jason Boutte in #432
- Add presentations and demos to sphinx toctree by Tom Vo in #422
- Update temporal
.average
and.departures
docstrings by Tom Vo in #407
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.4.0...v0.5.0
This minor release includes a feature update to support datasets that
have N dimensions mapped to N coordinates to represent an axis. This
means xcdat
APIs are able to intelligently select which axis's
coordinates and bounds to work with if multiple are present within the
dataset. Decoding time is now a lazy operation, leading to significant
upfront runtime improvements when opening datasets with
decode_times=True
.
A new notebook called “A Gentle Introduction to xCDAT” was added to the documentation gallery to help guide new xarray/xcdat users. xCDAT is now hosted on Zenodo with a DOI for citations.
There are various bug fixes for bounds, naming of spatial weights, and a
missing flag for xesmf
that broke curvilinear regridding.
- Support for N axis dimensions mapped to N coordinates by
Tom Vo and Stephen Po-Chedley in
#343
- Rename
get_axis_coord()
toget_dim_coords()
andget_axis_dim()
toget_dim_keys()
- Update spatial and temporal accessor class methods to refer to the dimension coordinate variable on the data_var being operated on, rather than the parent dataset
- Rename
- Decoding times (
decode_time()
) is now a lazy operation, which results in significant runtime improvements by Tom Vo in #343
- Fix
add_bounds()
not ignoring 0-dim singleton coords by Tom Vo and Stephen Po-Chedley in #343 - Fix name of spatial weights with singleton coord by Tom Vo in #379
- Fixes
xesmf
flag that was missing which broke curvilinear regridding by Jason Boutte and Stephen Po-Chedley in #374
- Add FAQs section for temporal metadata by Tom Vo in #383
- Add gentle introduction notebook by Tom Vo in #373
- Link repo to Zenodo and upload GitHub releases by Tom Vo in #367
- Update project overview, FAQs, and add a link to xarray tutorials by Tom Vo in #365
- Update feature list, add metadata interpretation to FAQs, and add
ipython
syntax highlighting for notebooks by Tom Vo in #362
- Update release-drafter template by Tom Vo in #371 and #370
- Automate release notes generation by Tom Vo in #368
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.3.3...v0.4.0
This patch release fixes a bug where calculating daily climatologies/departures for
specific CF calendar types that have leap days breaks when using cftime
. It also
includes documentation updates.
- Drop leap days based on CF calendar type to calculate daily
climatologies and departures by Tom Vo and Jiwoo Lee in
#350
- Affected CF calendar types include
gregorian
,proleptic_gregorian
, andstandard
- Since a solution implementation for handling leap days is generally opinionated, we decided to go with the route of least complexity and overhead (drop the leap days before performing calculations). We may revisit adding more options for the user to determine how they want to handle leap days (based on how valuable/desired it is).
- Affected CF calendar types include
- Add horizontal regridding gallery notebook by Jason Boutte in #328
- Add doc for staying up to date with releases by Tom Vo in #355
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.3.2...v0.3.3
This patch release focuses on bug fixes related to temporal averaging,
spatial averaging, and regridding. xesmf
is now an optional
dependency because it is not supported on osx-arm64
and windows
at this time. There is a new documentation page for HPC/Jupyter
guidance.
- Fix multiple temporal avg calls on same dataset breaking by Tom Vo in #329
- Fix incorrect results for group averaging with missing data by Stephen Po-Chedley in #320
- Fix spatial bugs: handle datasets with domain bounds out of order and zonal averaging by Stephen Po-Chedley in #340
- Fix regridder storing NaNs for bounds by Stephen Po-Chedley in #344
- Update README and add HPC/Jupyter Guidance by Stephen Po-Chedley in #331
- Make
xesmf
an optional dependency by Paul Durack in #334- This is required because
xesmf
(andesmpy
which is a dependency) are not supported onosx-arm64
andwindows
at this time. - Once these platforms are supported,
xesmf
can become a direct dependency ofxcdat
.
- This is required because
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.3.1...v0.3.2
This patch release focuses on bug fixes including handling bounds generation with singleton coordinates and the use of cftime
to represent temporal averaging outputs and non-CF compliant time coordinates (to avoid the pandas Timestamp limitations).
- Ignore singleton coordinates without dims when attempting to generate bounds by Stephen Po-Chedley in #281
- Modify logic to not throw error for singleton coordinates (with no bounds) by Stephen Po-Chedley in #313
- Fix
TypeError
with Dask Arrays from multifile datasets in temporal averaging by Stephen Po-Chedley in #291 - Use
cftime
to avoid out of boundsdatetime
when decoding non-CF time coordinates by Stephen Po-Chedley and Tom Vo in #283 - Use
cftime
for temporal averaging operations to avoid out of boundsdatetime
by Stephen Po-Chedley and Tom Vo in #302 - Fix
open_mfdataset()
dropping time encoding attrs by Tom Vo in #309 - Replace “time” references with
self._dim
inclass TemporalAccessor
by Tom Vo in #312
- Filters safe warnings. by Jason Boutte in #276
- update conda install to conda create by Paul Durack in #294
- Update project overview and planned features list by Tom Vo in #298
- Fix bullet formatting in
README.rst
andindex.rst
by Tom Vo in #299 - Fix Jupyter headings not rendering with pandoc by Tom Vo in #318
- Unify workspace settings with
settings.json
by Tom Vo in #297 - Run CI/CD on “push” and “workflow_dispatch” by Tom Vo in #287 and #288
- Pin
numba=0.55.2
in dev env and constrainnumba>=0.55.2
in ci env by Tom Vo in #280 - Update conda env yml files and add missing dependencies by Tom Vo in #307
- Paul Durack made their first contribution in #294
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.3.0...v0.3.1
- Add horizontal regridding by Jason Boutte in #164
- Add averages with time dimension removed by Tom Vo in #236
- Update
_get_weights()
method inclass SpatialAccessor
andclass TemporalAccessor
by Tom Vo in #252- Add
keep_weights
keyword attr to reduction methods - Make
_get_weights()
public inclass SpatialAccessor
- Add
- Update
get_axis_coord()
to interpret more keys by Tom Vo in #262- Along with the
axis
attr, it also now interpretsstandard_name
and the dimension name
- Along with the
- Fix
add_bounds()
breaking when time coords arecftime
objects by Tom Vo in #241 - Fix parsing of custom seasons for departures by Tom Vo in #246
- Update
swap_lon_axis
to ignore same systems, which was causing odd behaviors for (0, 360) by Tom Vo in #257
- Remove
class XCDATAccessor
by Tom Vo in #222 - Update spatial
axis
arg supported type and keys by Tom Vo in #226- Now only supports CF-compliant axis names (e.g., “X”, “Y”)
- Remove
center_times
kwarg from temporal averaging methods by Tom Vo in #254
- Revert official project name from “XCDAT” to “xCDAT” by Tom Vo in #231
- [DOC] Add CDAT API mapping table and gallery examples by Tom Vo in #239
- Update time coordinates object type from
MultiIndex
todatetime
/cftime
forTemporalAccessor
reduction methods and add convenience methods by Tom Vo in #221 - Extract method
_postprocess_dataset()
and make bounds generation optional by Tom Vo in #223 - Update
add_bounds
kwarg default value toTrue
by Tom Vo in #230 - Update
decode_non_cf_time
to return input dataset if the time “units” attr can’t be split into unit and reference date by Stephen Po-Chedley in #263
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.2.0...v0.3.0
- Add support for spatial averaging parallelism via Dask by Stephen Po-Chedley in #132
- Refactor spatial averaging with more robust handling of longitude spanning prime meridian by Stephen Po-Chedley in #152
- Update xcdat.open_mfdataset time decoding logic by Stephen Po-Chedley in #161
- Add function to swap dataset longitude axis orientation by Tom Vo in #145
- Add utility functions by Tom Vo in #205
- Add temporal utilities and averaging functionalities by Tom Vo in #107
- Add exception for coords of len <= 1 or multidimensional coords in
fill_missing_bounds()
by Tom Vo in #141 - Update
open_mfdataset()
to avoid data vars dim concatenation by Tom Vo in #143 - Fix indexing on axis keys using generic map (related to spatial averaging) by Tom Vo in #172
- Rename accessor classes and methods for API consistency by Tom Vo in #142
- Rename
fill_missing_bounds()
toadd_missing_bounds()
by Tom Vo in #157 - Remove data variable inference API by Tom Vo in #196
- Rename spatial file and class by Tom Vo in #207
- update README by Jill Chengzhu Zhang in #127
- Update readme by Jiwoo Lee in #129
- Update
HISTORY.rst
and fix docstrings by Tom Vo in #139 - Update
README.rst
content and add logo by Tom Vo in #153 - Update API Reference docs to list all APIs by Tom Vo in #155
- Add
config.yml
for issue templates with link to discussions by Tom Vo in #176 - Add FAQs page to docs by Tom Vo in #181
- Fix syntax of code examples from PR #181 by Tom Vo in #182
- Replace markdown issue templates with GitHub yml forms by Tom Vo in #186
- Update
README.rst
,index.rst
, andproject_maintenance.rst
by Tom Vo in #211
- Update logger levels to debug by Tom Vo in #148
- Update and remove logger debug messages by Tom Vo in #193
- Add
requires_dask
decorator for tests by Tom Vo in #177 - Update dependencies in
setup.py
anddev.yml
by Tom Vo in #174 - Add matrix testing and ci specific conda env by Tom Vo in #178
- Suppress xarray warning in test suite by Tom Vo in #179
- Drop support for Python 3.7 by Tom Vo in #187
- Update conda env dependencies by Tom Vo in #189
- Add deps to
pre-commit
mypy
and fix issues by Tom Vo in #191 - Add
matplotlib
to dev env, updateci.yml
and add Python 3.10 to build workflow by Tom Vo in #203 - Replace conda with mamba in rtd build by Tom Vo in #209
- Jill Chengzhu Zhang made their first contribution in #127
- Jiwoo Lee made their first contribution in #129
- Stephen Po-Chedley made their first contribution in #132
Full Changelog: https://github.com/xCDAT/xcdat/compare/v0.1.0...v0.2.0
- Add geospatial averaging API through
DatasetSpatialAverageAccessor
class by Stephen Po-Chedley and Tom Vo in #87- Does not support parallelism with Dask yet
- Add wrappers for xarray's
open_dataset
andopen_mfdataset
to apply common operations such as:- If the dataset has a time dimension, decode both CF and non-CF time units
- Generate bounds for supported coordinates if they don’t exist
- Option to limit the Dataset to a single regular (non-bounds) data variable while retaining any bounds data variables
- Add
DatasetBoundsAccessor
class for filling missing bounds, returning mapping of bounds, returning names of bounds keys - Add
BoundsAccessor
class for accessing xcdat public methods from other accessor classes- This will be probably be the API endpoint for most users, unless they prefer importing the individual accessor classes
- Add ability to infer data variables in xcdat APIs based on the
"xcdat_infer" Dataset attr
- This attr is set in
xcdat.open_dataset()
,xcdat_mfdataset()
, or manually
- This attr is set in
- Utilizes
cf_xarray
package (https://github.com/xarray-contrib/cf-xarray)
- Visit the docs here: https://xcdat.readthedocs.io/en/latest/index.html
- 100% code coverage (https://app.codecov.io/gh/xCDAT/xcdat)
- GH Actions for CI/CD build (https://github.com/xCDAT/xcdat/actions)
- Pytest and pytest-cov for test suite
Full Changelog: https://github.com/xCDAT/xcdat/commits/v0.1.0