xarray.DataArray.assign_coords#

DataArray.assign_coords(coords=None, **coords_kwargs)[source]#

Assign new coordinates to this object.

Returns a new object with all the original data in addition to the new coordinates.

Parameters:
  • coords (dict-like or None, optional) โ€“ A dict where the keys are the names of the coordinates with the new values to assign. If the values are callable, they are computed on this object and assigned to new coordinate variables. If the values are not callable, (e.g. a DataArray, scalar, or array), they are simply assigned. A new coordinate can also be defined and attached to an existing dimension using a tuple with the first element the dimension name and the second element the values for this new coordinate.

  • **coords_kwargs (optional) โ€“ The keyword arguments form of coords. One of coords or coords_kwargs must be provided.

Returns:

assigned (same type as caller) โ€“ A new object with the new coordinates in addition to the existing data.

Examples

Convert DataArray longitude coordinates from 0-359 to -180-179:

>>> da = xr.DataArray(
...     np.random.rand(4),
...     coords=[np.array([358, 359, 0, 1])],
...     dims="lon",
... )
>>> da
<xarray.DataArray (lon: 4)>
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
Coordinates:
  * lon      (lon) int64 358 359 0 1
>>> da.assign_coords(lon=(((da.lon + 180) % 360) - 180))
<xarray.DataArray (lon: 4)>
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
Coordinates:
  * lon      (lon) int64 -2 -1 0 1

The function also accepts dictionary arguments:

>>> da.assign_coords({"lon": (((da.lon + 180) % 360) - 180)})
<xarray.DataArray (lon: 4)>
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
Coordinates:
  * lon      (lon) int64 -2 -1 0 1

New coordinate can also be attached to an existing dimension:

>>> lon_2 = np.array([300, 289, 0, 1])
>>> da.assign_coords(lon_2=("lon", lon_2))
<xarray.DataArray (lon: 4)>
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
Coordinates:
  * lon      (lon) int64 358 359 0 1
    lon_2    (lon) int64 300 289 0 1

Note that the same result can also be obtained with a dict e.g.

>>> _ = da.assign_coords({"lon_2": ("lon", lon_2)})

Note the same method applies to Dataset objects.

Convert Dataset longitude coordinates from 0-359 to -180-179:

>>> temperature = np.linspace(20, 32, num=16).reshape(2, 2, 4)
>>> precipitation = 2 * np.identity(4).reshape(2, 2, 4)
>>> ds = xr.Dataset(
...     data_vars=dict(
...         temperature=(["x", "y", "time"], temperature),
...         precipitation=(["x", "y", "time"], precipitation),
...     ),
...     coords=dict(
...         lon=(["x", "y"], [[260.17, 260.68], [260.21, 260.77]]),
...         lat=(["x", "y"], [[42.25, 42.21], [42.63, 42.59]]),
...         time=pd.date_range("2014-09-06", periods=4),
...         reference_time=pd.Timestamp("2014-09-05"),
...     ),
...     attrs=dict(description="Weather-related data"),
... )
>>> ds
<xarray.Dataset>
Dimensions:         (x: 2, y: 2, time: 4)
Coordinates:
    lon             (x, y) float64 260.2 260.7 260.2 260.8
    lat             (x, y) float64 42.25 42.21 42.63 42.59
  * time            (time) datetime64[ns] 2014-09-06 2014-09-07 ... 2014-09-09
    reference_time  datetime64[ns] 2014-09-05
Dimensions without coordinates: x, y
Data variables:
    temperature     (x, y, time) float64 20.0 20.8 21.6 22.4 ... 30.4 31.2 32.0
    precipitation   (x, y, time) float64 2.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 2.0
Attributes:
    description:  Weather-related data
>>> ds.assign_coords(lon=(((ds.lon + 180) % 360) - 180))
<xarray.Dataset>
Dimensions:         (x: 2, y: 2, time: 4)
Coordinates:
    lon             (x, y) float64 -99.83 -99.32 -99.79 -99.23
    lat             (x, y) float64 42.25 42.21 42.63 42.59
  * time            (time) datetime64[ns] 2014-09-06 2014-09-07 ... 2014-09-09
    reference_time  datetime64[ns] 2014-09-05
Dimensions without coordinates: x, y
Data variables:
    temperature     (x, y, time) float64 20.0 20.8 21.6 22.4 ... 30.4 31.2 32.0
    precipitation   (x, y, time) float64 2.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 2.0
Attributes:
    description:  Weather-related data

Notes

Since coords_kwargs is a dictionary, the order of your arguments may not be preserved, and so the order of the new variables is not well defined. Assigning multiple variables within the same assign_coords is possible, but you cannot reference other variables created within the same assign_coords call.