This release adds read support for Zarr V3 rectilinear (variable-sized) chunks, Arrow PyCapsule export for :py:class:DataArray, a new :py:meth:DataArray.plot.lines plotting method, :py:class:DataTree support in :py:func:apply_ufunc, and flox-accelerated groupby medians. Bottleneck is now disabled by default, the remaining zarr-python 2 compatibility code has been removed, and the minimum h5netcdf version is now 1.8. It also includes many bug fixes.
This is the last xarray release that will support Python 3.11. Future releases will require Python 3.12 or later.
Thanks to the 45 contributors to this release:
ANIRUDDHA ADAK, Ahmet Kamer Çivi, Albert Yau, Andrew Scherer, Anirban Mandal, Aryan Singh K., Asish Kumar, Chandan P, Charles Turner, Deepak Cherian, Devraj Pal, Dipak Chaudhari, Eltsefon Mark, Evan Lyall, Illviljan, Joe Hamman, Johnson K C, Jules Chéron, Justus Magin, Kropiunig, Marcus Campbell, Mark Harfouche, Matt Van Horn, Matthew Rocklin, Matthias Schabel, Michael Niklas, Nick Hodgskin, Patrick N. Raanes, Peter Hron, Puneet Dixit, QinXi, Samuel Le Meur-Diebolt, Spencer Clark, Stanley C, Stephan Hoyer, Thomas Kluyver, Tom Nicholas, dsk0425-sketch, genrichez, hushen, imam, omsatpute61-afk, stepit, whn and ✨Sarah Z✨
What's Changed
- Add empty whats-new section for v2026.07.1 by @shoyer in #11446
- docs: remove unused imports in quick overview guide by @stefanopitton in #11444
- Fix dask rolling bottleneck dtype metadata by @mrocklin in #11449
- MAINT: Add make to Pixi::doc feature by @VeckoTheGecko in #11457
- Disable bottleneck by default by @takluyver in #11461
- Fix polyval returning a sentinel value for NaT in timedelta coordinates by @dchaudhari7177 in #11478
- Maintenance: Support zarr>=3.0 by @jhamman in #11232
- Fix stacking dimensions with falsy names by @JOhnsonKC201 in #11477
- Migrate from nbsphinx/jupyter-sphinx to myst_nb by @VeckoTheGecko in #11456
- Harmonize encoding from h5netcdf with netcdf4 by @hmaarrfk in #11067
- DOC explain how open_dataset handles grouped files by @Whning0513 in #11497
- docs: document stable sortby ordering by @Whning0513 in #11491
- docs: describe custom index inline representations by @Whning0513 in #11493
- DOCS: Update contrib instructions for Myst-nb by @VeckoTheGecko in #11487
- Rerun
generate_aggregations.pyby @VeckoTheGecko in #11489 - bump scientific-python/issue-from-pytest-log-action by @keewis in #11498
- Add
generate-aggregationsPixi task and CI workflow by @VeckoTheGecko in #11495 - bump
issue-from-pytest-log-actionto v1.6.2 by @keewis in #11500 - Improve aggregation docstrings to improve searchability by @SomeCoder23 in #11471
- move the nightly env into its own file by @keewis in #11481
- enable interactive exploration of examples using
jupyterlite-sphinxby @keewis in #10299 - BUG: Fix coordinate transform shape after transpose by @sdiebolt in #11513
- Remove
BooleanCoderfromzarrwrites by @elyall in #11318 - Use flox for median in groupby/resample operations by @sdiebolt in #11239
- CI: run slow Hypothesis job on schedule and dispatch by @aryansk in #11520
- fix: dask divide by zero error when empty dimensions are passed into partial autochunk spec by @charles-turner-1 in #11486
- Raise a TypeError when a Coordinates object is used as a coordinate value by @NoiceHax in #11523
- Avoid densifying sparse.COO data in to_series()/to_dataframe() by @patnr in #11528
- Fix CI: mypy errors and doctest warning by @dcherian in #11535
- Fix alignment and copy of transposed CoordinateTransformIndex-backed arrays by @sdiebolt in #11532
- Fix bool test arrays in construct_dataarray being all False by @marcus-campbell in #11529
- feat: add arrow_c_stream function by @jules-ch in #11338
- Fix scalar selection for nested tuple MultiIndex keys by @puneetdixit200 in #11348
- Fix LaTeX labels broken by textwrap in plot utils (#11452) by @genrichez in #11476
- Don't warn about a missing _FillValue for CF coordinate variables by @NoiceHax in #11524
- 11518: Fix keepdims in
DatasetGroupBy.xyzandDatasetRolling.xyzby @charles-turner-1 in #11521 - MAINT: Update pixi-lock action by @VeckoTheGecko in #11546
- Adapt to upstream change in resampling with a
Dayfrequency by @spencerkclark in #11547 - Require h5netcdf for running
TestNetCDF4ClassicViaH5NetCDFDatatests by @spencerkclark in #11550 - Adapt to change in behavior of
pd.DateOffsetinisinstanceby @spencerkclark in #11548 - fix typo/grammar in
Dataset._rename()docstring by @charles-turner-1 in #11557 - Fix type error for Coarsen reduction methods by @andrew-s28 in #11556
- Fix eager import of cftime in _maybe_cast_to_cftimeindex by @peterhron in #11558
- Add
spharmgridto Xarray ecosystem page by @mwyau in #11568 - ENH: Support DataTree in apply_ufunc by @QinXi-ai in #11552
- Fix bug in rechunking cftime arrays along a subset of dimensions by @spencerkclark in #11576
- Fix pandas roundtrip property test by @charles-turner-1 in #11575
- use a maintained version of emscripten-forge by @keewis in #11571
- fix the failing docs builds by @keewis in #11570
- Fix failing tests by @headtr1ck in #11608
- Mypy update by @headtr1ck in #11611
- docs: correct DataArray.pad constant_values default in docstring by @mvanhorn in #11375
- TYP: annotate open_zarr chunks argument by @omsatpute61-afk in #11579
- Install mypy type stubs statically instead of via --install-types by @headtr1ck in #11619
- Add GeoUtils to ecosystem list by @CoderAnirban71 in #11614
- Fix negative size for empty RangeIndex arange by @lowgame in #11624
- Fix the last-release benchmark workflow running zero benchmarks by @itzzdev09 in #11590
- Fix roll on an empty dimension by @matthiasschabel in #11613
- Preserve coordinates after non-leading-dimension groupby reductions by @officialasishkumar in #11290
- Test improvements by @headtr1ck in #11612
- fix(indexing): align in-memory indexer for empty ndarray keys by @aniruddhaadak80 in #11626
- Fix broadcast with an index spanning several dimensions by @matthiasschabel in #11615
- Fix CombinedLock deadlocks & flaky tests by @headtr1ck in #11622
- Raise error in diff() for a non-existent dimension by @imam2004i in #11628
- Fix nightly upstream-dev failures (#11501) by @headtr1ck in #11627
- Document how to find unlimited_dims via encoding by @CoderAnirban71 in #11618
- Fix str.replace(..., n=0) replacing every occurrence instead of none by @Kropiunig in #11545
- Warn when explicit dims rename tuple-style DataArray coords by @officialasishkumar in #11292
- Fix axis reordering bug in scipy backend outer indexing by @CoderAnirban71 in #11638
- fix: preserve stringdtype in zarr v3 round trips by @stanbot8 in #11474
- Add whats-new entry for scipy backend axis-reorder fix by @CoderAnirban71 in #11639
- Read-only support for Zarr V3 rectilinear (variable-size) chunks by @TomNicholas in #11592
- Update release command in HOW_TO_RELEASE.md by @TomNicholas in #11640
- Add LineCollection plot by @Illviljan in #7173
- Update whats-new for v2026.09.0 release by @TomNicholas in #11641
New Contributors
- @stefanopitton made their first contribution in #11444
- @dchaudhari7177 made their first contribution in #11478
- @JOhnsonKC201 made their first contribution in #11477
- @Whning0513 made their first contribution in #11497
- @SomeCoder23 made their first contribution in #11471
- @sdiebolt made their first contribution in #11513
- @elyall made their first contribution in #11318
- @aryansk made their first contribution in #11520
- @NoiceHax made their first contribution in #11523
- @patnr made their first contribution in #11528
- @marcus-campbell made their first contribution in #11529
- @jules-ch made their first contribution in #11338
- @puneetdixit200 made their first contribution in #11348
- @genrichez made their first contribution in #11476
- @peterhron made their first contribution in #11558
- @mwyau made their first contribution in #11568
- @QinXi-ai made their first contribution in #11552
- @omsatpute61-afk made their first contribution in #11579
- @CoderAnirban71 made their first contribution in #11614
- @lowgame made their first contribution in #11624
- @itzzdev09 made their first contribution in #11590
- @matthiasschabel made their first contribution in #11613
- @officialasishkumar made their first contribution in #11290
- @aniruddhaadak80 made their first contribution in #11626
- @imam2004i made their first contribution in #11628
- @Kropiunig made their first contribution in #11545
- @stanbot8 made their first contribution in #11474
Full Changelog: v2026.07.0...v2026.09.0