Convert a DataArray into an Iris Cube
(dataarray)
| 79 | |
| 80 | # TODO: Add converting bounds from xarray to Iris and back |
| 81 | def to_iris(dataarray): |
| 82 | """Convert a DataArray into an Iris Cube""" |
| 83 | # Iris not a hard dependency |
| 84 | import iris |
| 85 | from iris.fileformats.netcdf import parse_cell_methods |
| 86 | |
| 87 | dim_coords = [] |
| 88 | aux_coords = [] |
| 89 | |
| 90 | for coord_name in dataarray.coords: |
| 91 | coord = encode(dataarray.coords[coord_name]) |
| 92 | coord_args = _get_iris_args(coord.attrs) |
| 93 | coord_args["var_name"] = coord_name |
| 94 | axis = None |
| 95 | if coord.dims: |
| 96 | axis = dataarray.get_axis_num(coord.dims) |
| 97 | if coord_name in dataarray.dims: |
| 98 | try: |
| 99 | iris_coord = iris.coords.DimCoord(coord.values, **coord_args) |
| 100 | dim_coords.append((iris_coord, axis)) |
| 101 | except ValueError: |
| 102 | iris_coord = iris.coords.AuxCoord(coord.values, **coord_args) |
| 103 | aux_coords.append((iris_coord, axis)) |
| 104 | else: |
| 105 | iris_coord = iris.coords.AuxCoord(coord.values, **coord_args) |
| 106 | aux_coords.append((iris_coord, axis)) |
| 107 | |
| 108 | args = _get_iris_args(dataarray.attrs) |
| 109 | args["var_name"] = dataarray.name |
| 110 | args["dim_coords_and_dims"] = dim_coords |
| 111 | args["aux_coords_and_dims"] = aux_coords |
| 112 | if "cell_methods" in dataarray.attrs: |
| 113 | args["cell_methods"] = parse_cell_methods(dataarray.attrs["cell_methods"]) |
| 114 | |
| 115 | masked_data = duck_array_ops.masked_invalid(dataarray.data) |
| 116 | cube = iris.cube.Cube(masked_data, **args) |
| 117 | |
| 118 | return cube |
| 119 | |
| 120 | |
| 121 | def _iris_obj_to_attrs(obj): |
no test coverage detected
searching dependent graphs…