Releases: pydata/xarray
v2025.09.0
This release brings a number of small improvements and fixes, especially related to writing DataTree objects and netCDF files to disk.
Thanks to the 13 contributors to this release: Benoit Bovy, DHRUVA KUMAR KAUSHAL, Deepak Cherian, Dhruva Kumar Kaushal, Giacomo Caria, Ian Hunt-Isaak, Illviljan, Justus Magin, Kai Mühlbauer, Ruth Comer, Spencer Clark, Stephan Hoyer and Tom Nicholas
New Features
Support rechunking by SeasonResampler for seasonal data analysis (GH10425, PR10519). By Dhruva Kumar Kaushal.
Add convenience methods to Coordinates (PR10318) By Justus Magin.
Added load_datatree() for loading DataTree objects into memory from disk. It has the same relationship to open_datatree(), as load_dataset() has to open_dataset(). By Stephan Hoyer.
compute=False is now supported by DataTree.to_netcdf() and DataTree.to_zarr(). By Stephan Hoyer.
open_dataset will now correctly infer a path ending in .zarr/ as zarr By Ian Hunt-Isaak.
Breaking changes
Following pandas 3.0 (pandas-dev/pandas#61985), Day is no longer considered a Tick-like frequency. Therefore non-None values of offset and non-"start_day" values of origin will have no effect when resampling to a daily frequency for objects indexed by a xarray.CFTimeIndex. As in pandas-dev/pandas#62101 warnings will be emitted if non default values are provided in this context (GH10640, PR10650). By Spencer Clark.
The default backend engine used by Dataset.to_netcdf() and DataTree.to_netcdf() is now chosen consistently with open_dataset() and open_datatree(), using whichever netCDF libraries are available and valid, and preferring netCDF4 to h5netcdf to scipy (GH10654). This will change the default backend in some edge cases (e.g., from scipy to netCDF4 when writing to a file-like object or bytes). To override these new defaults, set engine explicitly. By Stephan Hoyer.
The return value of Dataset.to_netcdf() without path is now a memoryview object instead of bytes (PR10656). This removes an unnecessary memory copy and ensures consistency when using either engine="scipy" or engine="h5netcdf". If you need a bytes object, simply wrap the return value of to_netcdf() with bytes(). By Stephan Hoyer.
Bug fixes
Fix contour plots not normalizing the colors correctly when using for example logarithmic norms. (GH10551, PR10565) By Jimmy Westling.
Fix distribution of auto_complex keyword argument for open_datatree (GH10631, PR10632). By Kai Mühlbauer.
Warn instead of raise in case of misconfiguration of unlimited_dims originating from dataset.encoding, to prevent breaking users workflows (GH10647, PR10648). By Kai Mühlbauer.
DataTree.to_netcdf() and DataTree.to_zarr() now avoid redundant computation of Dask arrays with cross-group dependencies (GH10637). By Stephan Hoyer.
DataTree.to_netcdf() had h5netcdf hard-coded as default (GH10654). By Stephan Hoyer.
Internal Changes
Run TestNetCDF4Data as TestNetCDF4DataTree through open_datatree (PR10632). By Kai Mühlbauer.
v2025.08.0
This release brings the ability to load xarray objects asynchronously, write netCDF as bytes, fixes a number of bugs, and starts an important deprecation cycle for changing the default values of keyword arguments for various xarray combining functions.
Thanks to the 24 contributors to this release:
Alfonso Ladino, Brigitta Sipőcz, Claude, Deepak Cherian, Dimitri Papadopoulos Orfanos, Eric Jansen, Ian Hunt-Isaak, Ilan Gold, Illviljan, Julia Signell, Justus Magin, Kai Mühlbauer, Mathias Hauser, Matthew, Michael Niklas, Miguel Jimenez, Nick Hodgskin, Pratiman, Scott Staniewicz, Spencer Clark, Stephan Hoyer, Tom Nicholas, Yang Yang and jemmajeffree
What's Changed
- Add dev whats-new by @dcherian in #10522
- Improve warning message and tests for timedelta decoding by @shoyer in #10508
- Remove test skip by @VeckoTheGecko in #10523
- Pydap flaky tests by @Mikejmnez in #10525
- drop_vars: use emit_user_level_warning by @mathause in #10528
- Fix labeler for
topic-documentation
by @VeckoTheGecko in #10524 - CI: update actions location by @bsipocz in #10529
- Call
super().__init__()
inst.SearchStrategy
subclasses by @spencerkclark in #10543 - Fix kerchunk error in docs build by @dcherian in #10545
- Fix convert calendar with different dimension name by @ej81 in #10544
- Restructure API documentation into organized sections by @dcherian in #10540
- Unnecessary literal by @DimitriPapadopoulos in #10552
- Fix
DatetimeAccessor.strftime
errors due to upstream changes by @spencerkclark in #10550 - Fix transpose of BoolTypeArray, NativeEndiannessArray by @dcherian in #10546
- Pythagorean calculation with sub-optimal numerics by @DimitriPapadopoulos in #10575
- interp - Prefer broadcast over reindex when possible by @Illviljan in #10554
- Update documentation to copy tags when forking, so versioning is reasonable by @jemmajeffree in #10576
- install
pyarrow
from its official repo by @keewis in #10577 - fix: Filter out
StringDType
even when the backing array is notNumpyExtensionArray
by @ilan-gold in #10559 - fix: pd.Series in pandas>=3 does not preserve object dtype metadata by @ilan-gold in #10564
- Fix
_get_default_engine_netcdf
to check forh5netcdf
by @scottstanie in #10557 pre-commit
hook maintenance:typos
by @keewis in #10586- bump the build metadata by @keewis in #10592
- New defaults for
concat
,merge
,combine_*
by @jsignell in #10062 - Fix doctests by ignoring warning from netcdf by @jsignell in #10599
- Fix typo found by codespell by @DimitriPapadopoulos in #10601
- change the type of
ogp_custom_meta_tags
totuple
by @keewis in #10603 - Fix docstring in find_independent_seasons by @Illviljan in #10615
- Make warning message clearer when assigning to
PandasMultiIndex
by @jsignell in #10610 - Update pre-commit hooks by @pre-commit-ci[bot] in #10604
- Support for DataTree.to_netcdf to write to a file-like object or bytes by @mjwillson in #10571
- add kwarg to handle invalid files in open_mfdataset by @pratiman-91 in #9955
- Bump actions/download-artifact from 4 to 5 in the actions group by @dependabot[bot] in #10621
- Sanitize unlimited_dims when writing
to_netcdf
by @kmuehlbauer in #10608 - slicing a slice with an array without expanding the slice by @keewis in #10580
- Skip call to
.tolist()
when creating pd.Index by @y4n9squared in #10619 - fix: Empty
RangeIndex
Display by @ianhi in #10594 - clarify lazy behaviour and eager loading chunks=None in open_*-functions by @kmuehlbauer in #10627
- Avoid refining parent dimensions in NetCDF files by @shoyer in #10623
- Add DataTree.prune() method … by @aladinor in #10598
- Add asynchronous load method by @TomNicholas in #10327
- Fix
ds.merge
to prevent altering original object depending on join value by @jsignell in #10596 - release notes for v2025.08.0 by @TomNicholas in #10641
New Contributors
- @bsipocz made their first contribution in #10529
- @jemmajeffree made their first contribution in #10576
- @mjwillson made their first contribution in #10571
- @pratiman-91 made their first contribution in #9955
- @y4n9squared made their first contribution in #10619
Full Changelog: v2025.07.1...v2025.08.0
v2025.07.1
What's Changed
- New whatsnew section by @TomNicholas in #10496
- Update HOW_TO_RELEASE.md to reflect inability to push to main by @TomNicholas in #10497
- Enforce ruff/flake8-simplify rules (SIM) by @DimitriPapadopoulos in #10480
- Unnecessary generator by @DimitriPapadopoulos in #10506
- Use
is
when comparing type of two objects by @DimitriPapadopoulos in #10504 - More f-strings, less format() by @DimitriPapadopoulos in #10505
- Unnecessary lambda expression by @DimitriPapadopoulos in #10502
- Clean-up indexing adapter classes by @benbovy in #10355
- Add NDPointIndex (KDTree) by @benbovy in #10478
- Use a set comprehension by @DimitriPapadopoulos in #10509
- Update pre-commit ruff legacy alias by @DimitriPapadopoulos in #10511
- DOC: add Pandas(Multi)Index to API reference by @benbovy in #10515
- Allow setting (or skipping) new indexes in open_dataset by @benbovy in #8051
- Raise if
Index.create_variables
returns more variables than passed in throughset_xindex
by @dhruvak001 in #10503 - Expression not assigned by @DimitriPapadopoulos in #10507
- Update Custom Indexes section in api.rst by @dcherian in #10517
- Updates for Zarr 3 Dtypes by @ianhi in #10456
- Add release notes for v2025.07.1 by @dcherian in #10520
Full Changelog: v2025.07.0...v2025.07.1
v2025.07.0
This release extends xarray's support for custom index classes, restores support for reading netCDF3 files with SciPy, updates minimum dependencies, and fixes a number of bugs.
Thanks to the 17 contributors to this release:
Bas Nijholt, Benoit Bovy, Deepak Cherian, Dhruva Kumar Kaushal, Dimitri Papadopoulos Orfanos, Ian Hunt-Isaak, Kai Mühlbauer, Mathias Hauser, Maximilian Roos, Miguel Jimenez, Nick Hodgskin, Scott Henderson, Shuhao Cao, Spencer Clark, Stephan Hoyer, Tom Nicholas and Zsolt Cserna
What's Changed
- new whats-new section by @mathause in #10420
- Fix Pydap tests for numpy 2.3.0 changes (scalar string to unicode) by @kmuehlbauer in #10421
- Fixed color.shape != grid.shape in streamplot when nx != ny by @scaomath in #10411
- Fix
Index._repr_inline_()
signature by @benbovy in #10415 - Clean up backend indexing some more by @dcherian in #10376
- Check and fix chararray string dimension names by @kmuehlbauer in #10395
- Fix reindex on Dataset from MultiIndex DataFrame with RuntimeError by @csernazs in #10381
- Apply new ruff rules by @DimitriPapadopoulos in #10428
- BUG: Fix display with nested NumPy arrays by @basnijholt in #10222
- DOC: Add cf_xarray to ecosystem page by @VeckoTheGecko in #10443
- Expose top-level xarray.indexes in init by @dcherian in #10435
- fix assert_equal for DataTree by @mathause in #10440
- Use a set comprehension by @DimitriPapadopoulos in #10453
- Redundant list comprehension can be replaced using generator by @DimitriPapadopoulos in #10454
- Simplify chained comparison between the operands by @DimitriPapadopoulos in #10447
- Unassigned string statement by @DimitriPapadopoulos in #10452
- Iterate the dictionary directly instead of calling
.keys()
by @DimitriPapadopoulos in #10451 - Unnecessary tuple/list literal by @DimitriPapadopoulos in #10450
- Unreachable code by @DimitriPapadopoulos in #10449
- Appending to dictionary immediately following its definition by @DimitriPapadopoulos in #10448
- Exceptions are overlapping by @DimitriPapadopoulos in #10446
- Enforce ruff/Pylint Warnings (PLW) by @DimitriPapadopoulos in #10458
- Update pre-commit hook pre-commit by @DimitriPapadopoulos in #10461
- Enforce ruff/Pylint Refactor rules (PLR) by @DimitriPapadopoulos in #10459
- Enforce ruff/Pylint Convention rules (PLC) by @DimitriPapadopoulos in #10460
- Switch to using the NumFOCUS Code of Conduct by @shoyer in #10432
- More Pylint issues by @DimitriPapadopoulos in #10463
- More f-strings, less format() by @DimitriPapadopoulos in #10474
- Enforce ruff/flake8-2020 rules (YTT) by @DimitriPapadopoulos in #10467
- assert_equal: ensure check_dim_order=False works for DataTree by @mathause in #10442
- Keyword argument passed twice by @DimitriPapadopoulos in #10473
- Branches of the
if
statement have similar implementation by @DimitriPapadopoulos in #10475 - Enforce ruff/flake8-simplify rules (SIM) by @DimitriPapadopoulos in #10462
- Apply assorted ruff preview rules by @DimitriPapadopoulos in #10465
- Revert "Enforce ruff/flake8-simplify rules (SIM)" by @max-sixty in #10476
- Fix RangeIndex slicing by @benbovy in #10471
- Update error message regex for latest Zarr by @dcherian in #10485
- update dependencies; drop python 3.10 by @dhruvak001 in #10438
- Fix critical
np.timedelta64
encoding bugs by @spencerkclark in #10469 - Prevent pydap (dap4) to change string arrays to unicode type (testing). Fixed upstream by @Mikejmnez in #10482
- Downgrade zarr requests performance expectations for zarr 3.0.9 by @TomNicholas in #10491
- Use add_note() to annotate exceptions when encoding fails by @shoyer in #10464
- Check if zarr store supports consolidated metadata by @TomNicholas in #10457
- Fix Zarr 'number of requests' test by @ianhi in #10492
- Rename toplevel header from Contribute to Development by @scottyhq in #10472
- Release workflows: always check that the built dist is valid. by @dcherian in #10408
- Fix bug with
ci/release_contributors.py
script by @TomNicholas in #10494 - Release notes for v2025.07.0 by @TomNicholas in #10495
New Contributors
- @scaomath made their first contribution in #10411
- @csernazs made their first contribution in #10381
- @basnijholt made their first contribution in #10222
- @dhruvak001 made their first contribution in #10438
Full Changelog: v2025.06.1...v2025.07.0
v2025.06.1
This is quick bugfix release to remove an unintended dependency on typing_extensions
. Apologies for the trouble.
What's Changed
- Guard typing_extension import by @sjperkins in #10413
- (fix): disallow
NumpyExtensionArray
by @ilan-gold in #10334 - (fix):
ndim
accessible asnp.ndim
onPandasExtensionArray
by @ilan-gold in #10414 - Up-to-date instructions for reading & writing to Zarr with Xarray by @alxmrs in #10410
- Release 2025.06.1 by @dcherian in #10416
New Contributors
Full Changelog: v2025.06.0...v2025.06.1
v2025.06.0
This release brings HTML reprs to the documentation, fixes to flexible Xarray indexes, performance optimizations, more ergonomic seasonal grouping and resampling
with new SeasonGrouper and SeasonResampler objects, and bugfixes.
Thanks to the 33 contributors to this release:
Andrecho, Antoine Gibek, Benoit Bovy, Brian Michell, Christine P. Chai, David Huard, Davis Bennett, Deepak Cherian, Dimitri Papadopoulos Orfanos, Elliott Sales de Andrade, Erik, Erik Månsson, Giacomo Caria, Ilan Gold, Illviljan, Jesse Rusak, Jonathan Neuhauser, Justus Magin, Kai Mühlbauer, Kimoon Han, Konstantin Ntokas, Mark Harfouche, Michael Niklas, Nick Hodgskin, Niko Sirmpilatze, Pascal Bourgault, Scott Henderson, Simon Perkins, Spencer Clark, Tom Vo, Trevor James Smith, joseph nowak and micguerr-bopen
What's Changed
- Add
xarray-lmfit
extension for curve fitting to ecosystem documentation by @kmnhan in #10262 - Rename Twitter to X by @star1327p in #10283
- Add public typing.py module by @micguerr-bopen in #10215
- Adding xarray-eopf to ecosystem.rst by @konstntokas in #10289
- Add redirect for contributing guide by @scottyhq in #10282
- Add Index.should_add_coord_to_array by @benbovy in #10137
- Fix for scalar detection by @huard in #8821
- DOC: Remove reference to
absolufy-imports
from contributing guide by @VeckoTheGecko in #10290 - Do not rely on np.broadcast_to to perform trivial dimension insertion by @hmaarrfk in #10277
- (fix): remove
PandasExtensionArray
from repr by @ilan-gold in #10291 - Add SeasonGrouper, SeasonResampler by @dcherian in #9524
- dev whats-new by @dcherian in #10294
- Add back getattr for ExtensionArrays by @dcherian in #10278
- (fix): allow upcasting of nans in
as_shared_dtype
for extension arrays by @ilan-gold in #10292 - Fix BinGrouper when labels is not specified by @dcherian in #10295
- (fix): numeric
arrow
dtype deep copies by @ilan-gold in #10315 - Fix rolling mean on bool arrays by @gcaria in #10319
- Alignment of n-dimensional indexes with partially excluded dims by @benbovy in #10293
- FIX: prevent unnecessary type casts in rolling mean by @kmuehlbauer in #10341
- Remove
"Y"
and"M"
fromDatetimeUnitOptions
by @spencerkclark in #10306 - fix roundtripping zero-size timedelta arrays by @kmuehlbauer in #10313
- Implement literal
np.timedelta64
coding by @spencerkclark in #10101 - Set
.conjugate
as alias of.conj
, #10302 by @joneuhauser in #10303 - Fix setuptools deprecation warnings by @gcaria in #10300
- The URL in CONTRIBUTING.md was broken and didn't automatically redirect. by @erik-mansson in #10351
- Disallow standard calendar
np.datetime64
encoding prior to reform by @spencerkclark in #10352 - Docs: User Guide for Complex Numbers by @andrewendlinger in #10235
- Avoid copying vectorized indexes by @jder in #10316
- apply_ufunc: don't modify attrs on input variables by @erik-mansson in #10330
- ruff: default rule set by @DimitriPapadopoulos in #10360
- Fix "a array" misspelling by @DimitriPapadopoulos in #10365
- Apply assorted ruff/flake8-pytest-style rules (PT) by @DimitriPapadopoulos in #10363
- Apply assorted ruff/flake8-simplify rules (SIM) by @DimitriPapadopoulos in #10364
- Ignore ruff/Pyflakes rule F401 more precisely by @DimitriPapadopoulos in #10369
- Enforce ruff/refurb rules (FURB) by @DimitriPapadopoulos in #10367
- Enforce ruff/flake8-implicit-str-concat rules (ISC) by @DimitriPapadopoulos in #10368
- (fix): pandas extension array repr for int64[pyarrow] by @ilan-gold in #10317
- Apply assorted ruff/Pylint rules (PL) / Enforce PLE rules by @DimitriPapadopoulos in #10366
- Enforce ruff/flake8-pyi rules (PYI) by @DimitriPapadopoulos in #10359
- Implement cftime vectorization as discussed in PR #8322 by @antscloud in #8324
- Fix doc typo for caption "Interoperability" by @tomvothecoder in #10374
- use numpy dtype exposed by zarr array instead of metadata.data_type by @d-v-b in #10348
- Pin Mypy to 1.15 by @kmuehlbauer in #10378
- Improve html repr in dark mode (Jupyterlab + Xarray docs) by @benbovy in #10353
- Add missing AbstractWritableDataStore base methods and arguments by @sjperkins in #10343
- Enforce ruff/flynt rules (FLY) by @DimitriPapadopoulos in #10375
- Docs: Add links to getting help mermaid diagram by @scottyhq in #10324
- Grouper tweaks. by @dcherian in #10362
- html repr: improve style for dropdown sections by @benbovy in #10354
- Fix performance regression in interp from #9881 by @dcherian in #10370
- Avoid unsafe casts from float to unsigned int by @QuLogic in #9964
- DOC: Update link to Cartopy reference by @star1327p in #10386
- Update a link in ROMS_ocean_model.ipynb by @star1327p in #10394
- Automatic Dask-Zarr chunk alignment by @josephnowak in #10336
- added movement to Xarray related projects by @niksirbi in #10403
- Update concat for multi-variable indexes. by @dcherian in #10371
- Switch docs to jupyter-execute sphinx extension for HTML reprs by @scottyhq in #10383
- Adds chunk key encoding to kwargs passed to zarr by @BrianMichell in #10274
- Release v2025.06.0 by @dcherian in #10406
New Contributors
- @kmnhan made their first contribution in #10262
- @star1327p made their first contribution in #10283
- @micguerr-bopen made their first contribution in #10215
- @konstntokas made their first contribution in #10289
- @joneuhauser made their first contribution in #10303
- @erik-mansson made their first contribution in #10351
- @jder made their first contribution in #10316
- @sjperkins made their first contribution in #10343
- @niksirbi made their first contribution in #10403
- @BrianMichell made their first contribution in #10274
Full Changelog: v2025.04.0...v2025.06.0
v2025.04.0
This release brings bug fixes, better support for extension arrays including returning a
pandas.IntervalArray
from groupby_bins
, and performance improvements.
Thanks to the 24 contributors to this release:
Alban Farchi, Andrecho, Benoit Bovy, Deepak Cherian, Dimitri Papadopoulos Orfanos, Florian Jetter, Giacomo Caria, Ilan Gold, Illviljan, Joren Hammudoglu, Julia Signell, Kai Muehlbauer, Kai Mühlbauer, Mathias Hauser, Mattia Almansi, Michael Sumner, Miguel Jimenez, Nick Hodgskin (🦎 Vecko), Pascal Bourgault, Philip Chmielowiec, Scott Henderson, Spencer Clark, Stephan Hoyer and Tom Nicholas
What's Changed
- Add new whats-new section by @dcherian in #10190
- DOC: Remove mention of netcdf pypi package by @VeckoTheGecko in #10197
- Apply ruff preview rule RUF046 by @DimitriPapadopoulos in #10199
- Fix sparse dask repr test by @dcherian in #10200
- add
scipy-stubs
as extra[types]
dependency by @jorenham in #10202 - Fix references to core classes in docs by @malmans2 in #10207
- Fixes dimension order in
xarray.Dataset.to_stacked_array
by @aFarchi in #10205 - CI: Automatic PR labelling is back by @VeckoTheGecko in #10201
- Add datatree repr asv by @Illviljan in #10214
DatasetView.map
fixkeep_attrs
by @mathause in #10219- Fix broken Sphinx Roles by @philipc2 in #10225
- Fix doctests by @jsignell in #10230
- Fix mypy failures on main by @jsignell in #10232
- Add RangeIndex by @benbovy in #10076
- opendap / dap4 support for pydap backend by @Mikejmnez in #10182
- Fix: Docs generation create temporary files that are not cleaned up. by @andrewendlinger in #10238
- Remove
test_dask_layers_and_dependencies
by @fjetter in #10242 - Fix mypy, min-versions CI, xfail Zarr tests by @dcherian in #10255
- Switch documentation to pydata-sphinx-theme by @TomNicholas in #8708
- Support extension array indexes by @ilan-gold in #9671
- Update how-to-add-new-backend.rst by @mdsumner in #10240
- Improve alignment checks by @benbovy in #10251
- Avoid stacking when grouping by chunked array by @dcherian in #10254
- BinGrouper: Support setting labels when provided with IntervalIndex by @dcherian in #10259
- Fix infinite recursion when calling
np.fix
by @gcaria in #10248 - Fix benchmarks runners by @dcherian in #10265
- Shorten text repr for
DataTree
by @jsignell in #10139 - Fix reduction by subset of grouper dimensions by @dcherian in #10258
- BinGrouper: reduce indirection by @dcherian in #10270
- Fix convert calendar on non-temporal data in datasets by @aulemahal in #10268
- add return_scalar=False as array_wrap kwarg by @gcaria in #10264
- GroupBy: Finish eagerly_compute_group deprecation by @dcherian in #10253
- (fix): remove
_getattr__
method forPandasExtensionArray
by @ilan-gold in #10250 - Release notes for 2025.04.0 by @dcherian in #10272
New Contributors
- @jorenham made their first contribution in #10202
- @aFarchi made their first contribution in #10205
- @mdsumner made their first contribution in #10240
Full Changelog: v2025.03.1...v2025.04.0
v2025.03.1
This release brings the ability to specify fill_value
and write_empty_chunks
for Zarr V3 stores, and a few bug fixes.
Thanks to the 10 contributors to this release:
Andrecho, Deepak Cherian, Ian Hunt-Isaak, Karl Krauth, Mathias Hauser, Maximilian Roos, Nick Hodgskin (🦎 Vecko), Spencer Clark, Tom Nicholas and wpbonelli.
What's Changed
- Add dev whats-new by @dcherian in #10152
- Fix GitHub Actions badge in README by @spencerkclark in #10155
- Forbid datatree to zarr append dim by @TomNicholas in #10156
- Fix numpy advanced indexing docs link by @wpbonelli in #10160
- Update DataArray.to_zarr to match Dataset.to_zarr. by @Karl-Krauth in #10164
- Preserve label ordering for multi-variable GroupBy by @dcherian in #10151
- Move chunks-related functions to a new file by @max-sixty in #10172
- Move fit computation code to dedicated new file by @max-sixty in #10174
- Fix GroupBy first, last with flox by @dcherian in #10173
- Allow setting
fill_value
on Zarr format 3 arrays by @dcherian in #10161 - DataTree: sel & isel add error context by @mathause in #10154
- DOC: Update docstring to reflect renamed section (modifying Zarr stores) by @VeckoTheGecko in #10180
- Use explicit repo name in upstream wheels by @ianhi in #10181
- Fix: Correct axis labelling with units for FacetGrid plots by @andrewendlinger in #10185
- Vendor pandas to xarray conversion tests by @dcherian in #10187
- Support zarr
write_empty_chunks
for zarr-python 3 and up by @ianhi in #10177 - release 2025.03.1 by @dcherian in #10188
New Contributors
- @wpbonelli made their first contribution in #10160
- @andrewendlinger made their first contribution in #10185
Full Changelog: v2025.03.0...v2025.03.1
v2025.03.0
This release brings tested support for Python 3.13, support for reading Zarr V3 datasets into a :py:class:~xarray.DataTree
,
significant improvements to datetime & timedelta encoding/decoding, and improvements to the :py:class:~xarray.DataTree
API;
in addition to the usual bug fixes and other improvements.
Thanks to the 26 contributors to this release:
Alfonso Ladino, Benoit Bovy, Chuck Daniels, Deepak Cherian, Eni, Florian Jetter, Ian Hunt-Isaak, Jan, Joe Hamman, Josh Kihm, Julia Signell, Justus Magin, Kai Mühlbauer, Kobe Vandelanotte, Mathias Hauser, Max Jones, Maximilian Roos, Oliver Watt-Meyer, Sam Levang, Sander van Rijn, Spencer Clark, Stephan Hoyer, Tom Nicholas, Tom White, Vecko and maddogghoek
What's Changed
- add new section in whats-new.rst by @kmuehlbauer in #10011
- spelling fix: possibilites -> possibilities by @shoyer in #10023
- Duck array ops for
all
andany
by @tomwhite in #9883 map_over_datasets
: fix error message for wrong result type by @mathause in #10016- Use resolution-dependent default units for lazy time encoding by @spencerkclark in #10017
- DOC: Fix 404 on Cubed's documentation by @VeckoTheGecko in #10029
- use mean of min/max years as offset in calculation of datetime64 mean by @kmuehlbauer in #10035
- Fix dataarray drop attrs by @j-haacker in #10030
- Start splitting up
dataset.py
by @max-sixty in #10039 - Upgrade mypy to 1.15 by @max-sixty in #10041
- implement map_over_datasets kwargs by @kmuehlbauer in #10012
- run CI on
python=3.13
by @keewis in #9681 - Add
Coordinates.from_xindex
method (+ refactor API doc) by @benbovy in #10000 - Add types stubs to optional dependencies by @max-sixty in #10048
- Flexible coordinate transform by @benbovy in #9543
- More precisely type
pipe
methods by @chuckwondo in #10038 - Default to phony_dims="access" in h5netcdf-backend by @kmuehlbauer in #10058
- More permissive Index typing by @benbovy in #10067
- Restrict fastpath isel indexes to the case of all PandasIndex by @benbovy in #10066
- deprecate cftime_range() in favor of date_range(use_cftime=True) by @Maddogghoek in #10024
- Generalize lazy backend indexing a little more by @dcherian in #10078
- Another reduction in the size of
dataset.py
by @max-sixty in #10088 - Prune data tree for Isomorphic operations by @kobebryant432 in #10097
- Skip failing array api test. by @dcherian in #10102
- Pass node path to tokenize in
open_datatree
by @slevang in #10100 - Fix false timedelta decoding
SerializationWarning
and improve warning message by @spencerkclark in #10072 - Add typos check to pre-commit hooks by @max-sixty in #10040
- Ensure KeyError raised for zarr datasets missing dim names by @oliverwm1 in #10025
- Improve handling of dtype and NaT when encoding/decoding masked and packaged datetimes and timedeltas by @kmuehlbauer in #10050
- fix and supress some test warnings by @mathause in #10104
- Update asv badge url in README.md by @sjvrijn in #10113
- Fix broken Zarr test by @dcherian in #10109
- Pin pandas stubs by @jsignell in #10119
- Use
to_numpy
in time decoding by @dcherian in #10081 - explicitly cast the dtype of
where
's condition parameter tobool
by @keewis in #10087 - Better
uv
compatibility by @max-sixty in #10124 - Change
python_files
inpyproject.toml
to a list by @max-sixty in #10127 - Don't skip tests when on a
mypy
branch by @max-sixty in #10129 - Fix type issues from pandas stubs by @max-sixty in #10128
- Refactor compatibility modules into xarray.compat package by @max-sixty in #10131
- Refactor modules from
core
intoxarray.computation
by @max-sixty in #10132 - Split
apply_ufunc
out ofcomputation.py
by @max-sixty in #10133 - Refactor concat / combine / merge into
xarray/structure
by @max-sixty in #10134 - Fix test_distributed::test_async by @fjetter in #10138
- Refactor datetime and timedelta encoding for increased robustness by @spencerkclark in #9498
- [docs]
DataTree
cannot be constructed fromDataArray
by @mathause in #10142 - Fix
open_datatree
whendecode_cf=False
by @ianhi in #10141 - Fix version in requires_zarr_v3 fixture by @TomNicholas in #10145
- Adds open_datatree and load_datatree to the tutorial module by @eni-awowale in #10082
- Update flaky pydap test by @dcherian in #10149
- Use flox for grouped first, last. by @dcherian in #10148
- Refactor calendar fixtures by @dcherian in #10150
- Refactoring/fixing zarr-pyhton v3 incompatibilities in xarray datatrees by @aladinor in #10020
- Release 2025.03.0 by @dcherian in #10143
New Contributors
- @j-haacker made their first contribution in #10030
- @chuckwondo made their first contribution in #10038
- @Maddogghoek made their first contribution in #10024
- @kobebryant432 made their first contribution in #10097
- @oliverwm1 made their first contribution in #10025
- @ianhi made their first contribution in #10141
Full Changelog: v2025.01.2...v2025.03.0
v2025.01.2
This release brings non-nanosecond datetime and timedelta resolution to xarray, sharded reading in zarr, suggestion of correct names when trying to access non-existent data variables and bug fixes!
Thanks to the 16 contributors to this release: Deepak Cherian, Elliott Sales de Andrade, Jacob Prince-Bieker, Jimmy Westling, Joe Hamman, Joseph Nowak, Justus Magin, Kai Mühlbauer, Mattia Almansi, Michael Niklas, Roelof Rietbroek, Salaheddine EL FARISSI, Sam Levang, Spencer Clark, Stephan Hoyer and Tom Nicholas
What's Changed
- dev whats-new by @dcherian in #9936
- Remove outdated quantile test. by @dcherian in #9945
- Relax nanosecond datetime restriction in CF time decoding by @kmuehlbauer in #9618
- fix upstream dev issues by @kmuehlbauer in #9953
- Suggest the correct name when no key matches in the dataset by @Illviljan in #9943
- cast type to PDDatetimeUnitOptions by @kmuehlbauer in #9963
- Update time coding tests to assert exact equality by @spencerkclark in #9961
- remove dask-expr from CI runs, fix related tests by @kmuehlbauer in #9971
- Use zarr-fixture to prevent thread leakage errors by @kmuehlbauer in #9967
- fix weighted polyfit for arrays with more than 2 dimensions by @malmans2 in #9974
- Fix test_doc_example on big-endian systems by @QuLogic in #9949
- Remove unnecessary a article by @salahelfarissi in #9980
- Fix some typing by @dcherian in #9988
- Use flox for grouped first, last by @dcherian in #9986
- Add
shards
tovalid_encodings
to enable sharded Zarr writing by @jacobbieker in #9948 - Add shxarray to the xarray ecosystem list by @strawpants in #9995
- Remove repetitive that (replace it with the) by @salahelfarissi in #9994
- Enable
DataTree.to_zarr(compute=False)
by @slevang in #9958 - Add
time_unit
argument toCFTimeIndex.to_datetimeindex
by @spencerkclark in #9965 - fix mean for datetime-like using the respective time resolution unit by @kmuehlbauer in #9977
- Enable passing a
CFTimedeltaCoder
todecode_timedelta
by @spencerkclark in #9966 - Revert "Use flox for grouped first, last (#9986)" by @dcherian in #10001
- Fix infer_freq, check for subdtype "datetime64"/"timedelta64" by @kmuehlbauer in #9999
- Migrate Zarr region="auto" tests to a class by @dcherian in #9990
- Fix the push method when the limit parameter is bigger than the chunk… by @josephnowak in #9940
- Use
freq="D"
instead offreq="d"
inpd.timedelta_range
by @spencerkclark in #10004 - cast
numpy
scalars to arrays inNamedArray.from_array
by @keewis in #10008 - remove outdated type-ignores by @kmuehlbauer in #10006
- Preserve order of variables in combine_by_coords by @kmuehlbauer in #9070
- Add FAQ answer about API stability & backwards compatibility by @TomNicholas in #9855
- release notes: 2025.01.2 by @kmuehlbauer in #10007
New Contributors
- @salahelfarissi made their first contribution in #9980
- @jacobbieker made their first contribution in #9948
- @strawpants made their first contribution in #9995
Full Changelog: v2025.01.1...v2025.01.2