Skip to content

Stricter defaults for concat, combine, open_mfdataset, merge #8778

Open

Description

@dcherian

Is your feature request related to a problem?

The defaults for concat are excessively permissive: data_vars="all", coords="different", compat="no_conflicts", join="outer". This comment illustrates why this can be hard to predict or understand: a seemingly unrelated option decode_cf controls whether a variable is in data_vars or coords, and can result in wildly different concatenation behaviour.

  1. This always concatenates data_vars along concat_dim even if they did not have that dimension to begin with.
  2. If the same coordinate var exists in different datasets/files, they will be sequentially compared for equality to decide whether they get concatenated.
  3. The outer join (applied along all dimensions that are not concat_dim) can result in very large datasets due to small floating points differences in the indexes, and also questionable behaviour with staggered grid datasets.
  4. "no_conflicts" basically picks the first not-NaN value after aligning all datasets, but is quite slow (we should be using duck_array_ops.nanfirst here I think).

While "convenient" this really just makes the default experience quite bad with hard-to-understand slowdowns.

Describe the solution you'd like

I propose we migrate to data_vars="minimal", coords="minimal", join="exact", compat="override". This should

  1. only concatenate data_vars and coords variables when they already have concat_dim.
  2. For any variables that do not have concat_dim, it will blindly pick them from the first file.
  3. join="exact" will prevent ballooning of dimension sizes due to floating point inequalities.
  4. These options will totally avoid any data reads unless explicitly requested by the user.

Unfortunately, this has a pretty big blast radius so we'd need a long deprecation cycle.

Describe alternatives you've considered

No response

Additional context

xref #4824
xref #1385
xref #8231
xref #5381
xref #2064
xref #2217

Activity

  1. TomNicholas commented on Feb 22, 2024

    @TomNicholas
    Member

    Thanks for raising this @dcherian. I support this, along with some effort to improve the docstrings/documentation/faq to make the default behaviour and potential pitfalls clearer.

    What would a deprecation cycle for this look like? We're talking about changing the default values of 4 different keyword arguments, that get used in open_mfdataset, concat, combine_nested and combine_by_coords. Should we rip the bandaid off and change them all at once?

  2. dcherian commented on Feb 23, 2024

    @dcherian
    ContributorAuthor

    Should we rip the bandaid off and change them all at once?

    +1. it would be massively confusing otherwise.

  3. jsignell commented on May 10, 2024

    @jsignell
    Member

    Regarding deprecation cycle. I think something like:

    • add a setting option that turns on the new defaults so that people can opt in prematurely
    • If user does not specify each of those 4 kwargs raise a warning indicating the behavior will change in the future and suggest they use the setting option to opt in.
    • If user does specify those 4 kwargs -> no warning
    • If user has opted in to the setting option -> no warning
  4. max-sixty commented on May 10, 2024

    @max-sixty
    Collaborator

    Broadly agree with @jsignell, one dissent:

    If user does not specify each of those 4 kwargs raise a warning indicating the behavior will change in the future and suggest they use the setting option to opt in.

    ...iff the behavior from xarray would be different.

    Otherwise this will be really noisy. Requires some work to assess whether the behavior will change in the concat call, but I think worthwhile / the cost of making the change...

  5. changed the title [-]Stricter defaults for concat, combine, open_mfdataset[/-] [+]Stricter defaults for concat, combine, open_mfdataset, merge[/+] on Jan 23, 2025
  6. jsignell commented on Feb 14, 2025

    @jsignell
    Member

    I just opened a draft PR (#10051) that tries to throw warnings iff the behavior from xarray would be different.

    So far I am working with the existing tests and I have:

    • one test where the result is the same with the new kwargs and a warning gets thown anyways (this seems ok to me)
    • one test where the result is different with the new kwargs but no warning gets thrown (that is not ok - and is why the PR is in draft)

    I'm still have more work to do on testing as well.

  7. dcherian commented on Feb 14, 2025

    @dcherian
    ContributorAuthor

    thank you thank you thank you so much for taking this one. It's the number one pain point for new Xarray users today IMO.

  8. jsignell commented on Feb 14, 2025

    @jsignell
    Member

    I'm trying 😅

    @TomNicholas reminded me on the PR that this is not just about open_mfdatasets but also about other combine functionality. I took a look and it seems like there is a some discrepancy in the defaults right now:

    key new value open_mfdatasets, combine_nested, combine_by_coords concat merge, xr.Dataset.merge
    data_vars "minimal" "all" "all" NA
    coords "minimal" "different" "different" NA
    compat "override" "no_conflicts" "equals" "no_conflicts"
    join "exact" "outer" "outer" "outer"

    I think concat should get the updated to the same new values, but should merge?

  9. dcherian commented on Feb 14, 2025

    @dcherian
    ContributorAuthor

    Yes merge should be updated. no_conflicts is a really bad and wasteful default (e.g. #5381). Its implementation could also be substantially improved IIRC.

  10. jsignell commented on Mar 5, 2025

    @jsignell
    Member

    Ok! Just to close the loop. I finally finished updating tests on #10062 so that one is fully ready for review (it's just missing doc changes).

    #10062 uses sentinels as the kwarg default values and the sentinels get pushed all the way down into the code where we can detect if the outcome would change with the new default value. This allows us to warn without doing additional computation and without too many false alarms. The sentinel also makes it easy to provide the user with both the old default value and the new default value in the warning message - even though the old default value differs based on the function it came from (see #8778 (comment))

    #10062 also introduces a new top-level option that controls whether to use old or new default values for these 4 kwargs. The idea for that option came from this comment (#8778 (comment)). More on the new option and steps after #10062 lands: #10062 (comment)

  11. jsignell commented on Aug 1, 2025

    @jsignell
    Member

    @dcherian just merged #10062 which starts the deprecation cycle that will eventually close this issue and make the new defaults: data_vars=None, coords="minimal", join="exact", compat="override"

    As of right now on main you can use xr.set_options(use_new_combine_kwarg_defaults=True) to opt into the new behavior early. If you do not opt in, then you will get FutureWarnings when you do combine operations (merge, concat, open_mfdataset) that will get different results in the future.

    #10062 will be in the v2025.08.0 release. What release would be appropriate for flipping the switch on the option so that by default: use_new_combine_kwarg_defaults=True?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions