Releases: pydata/xarray
v2026.02.0
What's Changed
- Add empty whats-new section for v2026.02.0 by @dcherian in #11110
- Add a suggestion for how to resolve chunk manager not available error by @jsignell in #11056
- DOC: Fix broken link in gallery by @VeckoTheGecko in #11115
- DOC: Various Numpydoc fixes by @VeckoTheGecko in #11122
- DOC: Correct some wording mistakes in xarray documentation by @star1327p in #11120
- DOC: Fix "latest" version displayed on landing page by @VeckoTheGecko in #11119
- Fix silent data corruption when writing dask arrays to sharded zarr stores by @kkollsga in #11117
- Slightly Amend Zarr Encoding Specification Doc #8749 by @eshort0401 in #11013
- DOC: Options A and A -> Options A and B by @star1327p in #11127
- Fix
.ploterror when using positional args withcolandrowby @jsignell in #11111 - Add a fast path that doesn't include normalized chunks in tokenize by @jsignell in #11017
- DOC: Fix link by @VeckoTheGecko in #11135
- create issue if nightly wheel upload fails by @ianhi in #11132
- Support negative step in normalize_indexer by @avalentino in #11044
- Allow 1D coords in NDPointIndex by @ianhi in #11116
- Replace
DeprecationWarningwithFutureWarningby @jsignell in #11112 - Fix sortby descending order placing NaNs at beginning instead of end by @kkollsga in #11118
- Update docstrings for pandas 3 by @jsignell in #11130
- Raise FileNotFoundError for missing local files in guess_engine by @kkollsga in #11150
- add osx-64 to the pixi config. by @ChrisBarker-NOAA in #11137
- Skip one more hypothesis test for dtype string by @jsignell in #11152
- temporarily silence shape assignment warnings raised in
netCDF4by @keewis in #11146 - DOC: Fix broken links (404 errors) by @VeckoTheGecko in #11161
- Refactor
cache-pixi-lock.ymlworkflow into external action by @VeckoTheGecko in #11096 - MAINT: Add linkcheck Pixi task by @VeckoTheGecko in #11160
- DOC: Add descriptions for pixi tasks by @VeckoTheGecko in #11155
- DOC: Update open_zarr decode_cf docstring by @VeckoTheGecko in #11165
- DOC: Add myst markdown support by @VeckoTheGecko in #11167
- raise error on slice-based selection of multi-index levels by @Mr-Neutr0n in #11168
- Update whats-new for v2026.02.0 release by @ianhi in #11163
- Add #11168 to whats-new by @ianhi in #11169
New Contributors
- @kkollsga made their first contribution in #11117
- @eshort0401 made their first contribution in #11013
- @avalentino made their first contribution in #11044
- @ChrisBarker-NOAA made their first contribution in #11137
- @Mr-Neutr0n made their first contribution in #11168
Full Changelog: v2026.01.0...v2026.02.0
v2026.01.0
What's Changed
- new release section by @keewis in #10985
- Address pandas-related upstream errors in #10973 by @spencerkclark in #10988
- make error message more clear by @d-v-b in #10994
- Change behavior of
keep_attrsinxr.wherewhen x is a scalar by @jsignell in #10997 - Backend fastpath by @slevang in #10937
- Switch from
sphinx-llms-txt=>sphinx-llmby @jacobtomlinson in #11003 - Unpin array api strict by @JJFlorian in #10983
- Fix RTD builds by restricting test-nightly platforms by @max-sixty in #11021
- add
drop_existingkwarg toset_xindexby @ianhi in #11008 - fix paths in readme by @JJFlorian in #11032
- Automatically create xindex by @ianhi in #11029
- FIX:
assert_identicalnow considersxindexes+ improveRangeIndexequals by @ianhi in #11035 - fix: where for
cupy.arrayby @hoxbro in #11026 - Ensure
SeasonResamplerpreserves datetime resolution by @spencerkclark in #11049 - Address upstream failures revealed in #11043 by @spencerkclark in #11050
- re-enable the minimum versions ci by @keewis in #11027
- Fix indexing bugs in
CoordinateTransformIndexby @dcherian in #10980 - DOC: Correct grammatical errors such as 'a xarray' -> 'an xarray' by @star1327p in #11058
- documenting how xarray.dot() interacts with coordinates by @dhruvak001 in #10958
- Remove special mapping of
autoto {} inopen_zarrby @jsignell in #11010 - fix group by > 1 group, then map by @joshua-gould in #11005
- Add cross-links for apply_ufunc in top-level API documentation by @Sakshee-D in #11063
- Make parallel documentation builds threadsafe by @jacobtomlinson in #11009
- bug fix combined-lock-locked issue #10843 by @samay2504 in #11022
- Fix mypy errors with newer pandas-stubs by @max-sixty in #11066
- Bump the minimum version of h5netcdf to 1.4.0 in accordance with nep29 by @hmaarrfk in #11068
- chore(pixi): fix solvability on windows by @lucascolley in #11084
- Add an
arithmetic_compatoption toxr.set_optionsby @mjwillson in #10943 - Improve HTML reprs by @shoyer in #10816
- use a pixi-build-python version compatible with the newest pixi by @keewis in #11090
Dataset.evalworks with >2 dims by @max-sixty in #11064- create a development environment by @keewis in #10995
- Better ordering of coords in repr by @jsignell in #11091
- DOC: Correct more typos in xarray documentation by @star1327p in #11092
- rolling window doc update by @barronh in #11094
- Coerce
pd.StringDtypetonp.dtypes.StringDTypeby @jsignell in #11102 - MAINT: Update pixi pin to v0.63.2 by @VeckoTheGecko in #11106
- DOCS: Update contributing instructions with note on pixi version by @VeckoTheGecko in #11108
- Use
StringDTypewhen reading from zarr string variables by @jsignell in #11097 - Optimize CFMaskScale decoder. by @dcherian in #11105
- Ensure netcdf4 is locked while closing by @dschwoerer in #10788
- Prep for new combine kwargs: improve combine docstrings, tidy up tests by @jsignell in #11080
- Improve error message when scipy is missing for NDPointIndex by @Sakshee-D in #11085
- Update whats-new for v2026.01.0 release by @dcherian in #11109
New Contributors
- @JJFlorian made their first contribution in #10983
- @joshua-gould made their first contribution in #11005
- @Sakshee-D made their first contribution in #11063
- @samay2504 made their first contribution in #11022
- @lucascolley made their first contribution in #11084
Full Changelog: v2025.12.0...v2026.01.0
v2025.12.0
This release rolls back the default engine for HTTP urls, adds support for DataTree objects in combine_nested and contains numerous bug fixes.
Thanks to the 16 contributors to this release:
Benoit Bovy, Christine P. Chai, Deepak Cherian, Dhruva Kumar Kaushal, Ian Hunt-Isaak, Ilan Gold, Illviljan, Julia Signell, Justus Magin, Lars Buntemeyer, Maximilian Roos, Miguel Jimenez, Nick Hodgskin, Richard Berg, Spencer Clark and Stephan Hoyer
What's Changed
- new release section by @keewis in #10926
- Fix numpy typing issue with numpy=2.3.5 by @shoyer in #10935
- support combine_nested on DataTree objects by @shoyer in #10849
- [pydap backend] enables downloading multiple dim arrays within single http request by @Mikejmnez in #10629
- Fix flaky Hypothesis stateful test for unique name generation by @max-sixty in #10946
- normalize the first indexer by @keewis in #10948
- Mostly restore
netcdfbackend behavior with URLs by @ianhi in #10931 - Adapt to change in behavior of
pandas.Timestampconstructor by @spencerkclark in #10944 - DOC: Correct many grammatical issues by @star1327p in #10959
- avoid casting custom indexes in
Dataset.drop_attrsby @keewis in #10961 - Fix type annotation for DataVariables to use Hashable instead of Any by @dhruvak001 in #10960
- Coerce
IndexVariabletoVariablewhen assigning to data variables or coordinates by @jsignell in #10909 - (fix): handle internal type promotion and
nas for extension arrays properly by @ilan-gold in #10423 - Migrate development workflow to Pixi by @VeckoTheGecko in #10888
- Fix workflow name to embed
matrix.pytest-addoptsby @VeckoTheGecko in #10970 - Add GitHub Codespaces config for Pixi by @VeckoTheGecko in #10929
- small changes to the pixi env definitions by @keewis in #10976
- Use
._datainVariable._replaceby @dcherian in #10969 - Support decoding unsigned integers to timedelta by @dcherian in #10972
- DOC: Remove RTD htmlzip output format by @VeckoTheGecko in #10977
- document limitations of cftime arithmetics by @larsbuntemeyer in #10653
- DOC: Add
llms.txtgeneration to build process by @VeckoTheGecko in #10978 - release v2025.12.0 by @keewis in #10981
- set the release date by @keewis in #10984
New Contributors
- @larsbuntemeyer made their first contribution in #10653
Full Changelog: v2025.11.0...v2025.12.0
v2025.11.0
This release changes the default for keep_attrs such that attributes are preserved by default, adds support for DataTree in top-level functions, and contains several memory and performance improvements as well as a number of bug fixes.
Thanks to the 21 contributors to this release:
Aled Owen, Charles Turner, Christine P. Chai, David Huard, Deepak Cherian, Gregorio L. Trevisan, Ian Hunt-Isaak, Ilan Gold, Illviljan, Jan Meischner, Jemma Jeffree, Jonas Lundholm Bertelsen, Justus Magin, Kai Mühlbauer, Kristian Bodolai, Lukas Riedel, Max Jones, Maximilian Roos, Niclas Rieger, Stephan Hoyer and William Andrea
What's Changed
- Blank whats new for 2025.10.2 by @shoyer in #10830
- Change
keep_attrsdefault toTrueby @max-sixty in #10726 - Add support for DataTree to xarray.merge() by @shoyer in #10790
- Fix equivalent() for NumPy scalar NaN comparison by @max-sixty in #10838
- Fix Dataset.map to handle non-DataArray outputs by @max-sixty in #10839
- Support DataTree in xarray.concat() by @shoyer in #10846
- Fix typing for to_zarr() methods by @shoyer in #10847
- Add version requirement to matplotlib by @Illviljan in #10837
- Add chunks='auto' support for cftime datasets by @charles-turner-1 in #10527
- new dependency for zarr in the nightly ci by @keewis in #10857
- Add support for NETCDF4_CLASSIC to h5netcdf engine by @huard in #10686
- fix h5netcdf backend for format=None, use same rule as netcdf4 backend by @kmuehlbauer in #10859
- fix: be more cautious when guessing what a backend can open by @ianhi in #10804
- Update docs to reflect open_mfdataset default chunk behaviour by @jemmajeffree in #10567
pre-commithook maintenance by @keewis in #10871- Fix empty indexing by @kmuehlbauer in #10870
- Minimize concat memory usage by @dcherian in #10866
- DOC: Correct typos: lets -> let's by @star1327p in #10874
- Use version-independent Zenodo DOI by @gtrevisan in #10881
- Import h5netcdf.core to use EnumType by @maxrjones in #10779
- Fix typing issue with numpy 2.3.4 by @shoyer in #10882
- xfail pydap datatree tests by @shoyer in #10869
- remove notes pointing to non-existing projects by @KBodolai in #10877
- [docs] Remove duplicated example in ".where" by @jmeischner in #10884
- Update pydap link in installation guide by @nicrie in #10885
- Fix
drop_selfor a MultiIndex by @owena11 in #10863 - Switch to use cmap.with_extremes by @Illviljan in #10836
- fix: error handling decode_cf_var exceptions - use add_note by @jonaslb in #10886
- fix: don't expect string arrays to roundtrip in
pandasby @ilan-gold in #10894 - DOC: Typo in terminology.rst by @wjandrea in #10897
- support datatree in
assert_allcloseby @keewis in #10887 - DOC: Correct typos like a/an usage by @star1327p in #10905
- Fix fill_value handling during unstack by @peanutfun in #10901
- Simplify implementation of merge() for DataTree by @shoyer in #10844
- Rewrite test_iso8601_decode to work without cftime by @dcherian in #10914
- DOC: Correct minor grammar issues by @star1327p in #10915
- skip ci based on a label by @keewis in #10918
- Optimize padding for coarsening. by @dcherian in #10921
- release v2025.11.0 by @keewis in #10917
New Contributors
- @charles-turner-1 made their first contribution in #10527
- @KBodolai made their first contribution in #10877
- @jmeischner made their first contribution in #10884
- @owena11 made their first contribution in #10863
- @jonaslb made their first contribution in #10886
- @wjandrea made their first contribution in #10897
- @peanutfun made their first contribution in #10901
Full Changelog: v2025.10.1...v2025.11.0
v2025.10.1
This release actually reverts a breaking change to Xarray's preferred netCDF backend.
v2025.10.0
This release reverts a breaking change to Xarray's preferred netCDF backend.
v2025.09.1
This release contains improvements to netCDF IO and the DataTree.from_dict() constructor, as well as a variety of bug fixes. In particular, the default netCDF backend has switched from netCDF4 to h5netcdf, which is typically faster.
Thanks to the 17 contributors to this release: Claude, Deepak Cherian, Dimitri Papadopoulos Orfanos, Dylan H. Morris, Emmanuel Mathot, Ian Hunt-Isaak, Joren Hammudoglu, Julia Signell, Justus Magin, Maximilian Roos, Nick Hodgskin, Spencer Clark, Stephan Hoyer, Tom Nicholas, gronniger, joseph nowak and pierre-manchon
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-documentationby @VeckoTheGecko in #10524 - CI: update actions location by @bsipocz in #10529
- Call
super().__init__()inst.SearchStrategysubclasses 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.strftimeerrors 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
pyarrowfrom its official repo by @keewis in #10577 - fix: Filter out
StringDTypeeven when the backing array is notNumpyExtensionArrayby @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_netcdfto check forh5netcdfby @scottstanie in #10557 pre-commithook maintenance:typosby @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_tagstotupleby @keewis in #10603 - Fix docstring in find_independent_seasons by @Illviljan in #10615
- Make warning message clearer when assigning to
PandasMultiIndexby @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_netcdfby @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
RangeIndexDisplay 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.mergeto 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
iswhen 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_variablesreturns more variables than passed in throughset_xindexby @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