xarray dataArray не удалось преобразовать в файл netcdf

#netcdf #python-xarray #netcdf4

Вопрос:

Я хочу преобразовать объект dataArray:

 print(dO18Buton)
 

Массив данных «dO18» (время: 480, широта: 3, долгота: 4)>
массив([[[-4.880011 , -5.124271 , -5.3803325, -5.6058764],
[-5.3377748, -5.833566 , -5.9842467, -5.876422 ],
[-6.014824 , -5.9881806, -5.3263307, -5.022347 ]],

    [[-5.160749 , -6.0551167, -6.506145 , -6.2277913],
    [-6.419599 , -6.5028667, -6.3349605, -6.0087442],
    [-6.793201 , -7.4350834, -8.72767  , -9.683132 ]],

   [[-3.7316084, -4.0689707, -4.8186183, -5.7664514],
    [-4.2518973, -4.527271 , -5.304754 , -6.1962605],
    [-5.832672 , -5.5838227, -5.449891 , -5.5966973]],

   ...,

   [[-2.5347471, -2.7267933, -2.4660826, -2.6986003],
    [-2.5378466, -2.4775863, -2.3831725, -2.4046302],
    [-2.6648045, -2.6119947, -2.4898052, -2.6828647]],

   [[-3.6972165, -3.9601326, -4.220426 , -4.639566 ],
    [-4.910946 , -5.022526 , -5.248487 , -5.4792166],
    [-6.3120723, -6.1730146, -5.925238 , -5.7671666]],

   [[-6.1374903, -4.9562454, -4.483402 , -4.5176744],
    [-7.894933 , -7.206261 , -6.434858 , -6.016612 ],
    [-7.5923204, -7.699311 , -7.642746 , -7.5549483]]], dtype=float32) Coordinates:   * time       (time) datetime64[ns]
 

1979-01-01 1979-02-01 … 2018-12-01 * долгота (долгота)
поплавок64 120.0 121.9 123.8 125.6 * широта (широта) float64
-6.667 -4.762 -2.857 Атрибуты:
описание: do18прецензионные
единицы измерения: за миллион

в файл netcdf с помощью to_netcdf() метода, но получил эту ошибку, связанную с datetime преобразованием:

 dO18Buton.to_netcdf('dO18Buton.nc',
               engine='netcdf4')
 
 ---------------------------------------------------------------------------
ParserError                               Traceback (most recent call last)
pandas/_libs/tslibs/conversion.pyx in pandas._libs.tslibs.conversion._convert_str_to_tsobject()

pandas/_libs/tslibs/parsing.pyx in pandas._libs.tslibs.parsing.parse_datetime_string()

~/anaconda3/lib/python3.8/site-packages/dateutil/parser/_parser.py in parse(timestr, parserinfo, **kwargs)
   1373     else:
-> 1374         return DEFAULTPARSER.parse(timestr, **kwargs)
   1375 

~/anaconda3/lib/python3.8/site-packages/dateutil/parser/_parser.py in parse(self, timestr, default, ignoretz, tzinfos, **kwargs)
    648         if res is None:
--> 649             raise ParserError("Unknown string format: %s", timestr)
    650 

ParserError: Unknown string format: 1979-1-1 0

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-89-d112295439b8> in <module>
----> 1 dO18Buton.to_netcdf('dO18Buton.nc',
      2                    engine='netcdf4')

~/anaconda3/lib/python3.8/site-packages/xarray/core/dataarray.py in to_netcdf(self, *args, **kwargs)
   2820             dataset = self.to_dataset()
   2821 
-> 2822         return dataset.to_netcdf(*args, **kwargs)
   2823 
   2824     def to_dict(self, data: bool = True) -> dict:

~/anaconda3/lib/python3.8/site-packages/xarray/core/dataset.py in to_netcdf(self, path, mode, format, group, engine, encoding,
 

unlimited_dims, compute, invalid_netcdf)
1898 from ..backends.api import to_netcdf
1899
-> 1900 return to_netcdf(
1901 self,
1902 path,

 ~/anaconda3/lib/python3.8/site-packages/xarray/backends/api.py in to_netcdf(dataset, path_or_file, mode, format, group, engine,
 

encoding, unlimited_dims, compute, multifile, invalid_netcdf)
1075 # TODO: allow this work (setting up the file for writing array data)
1076 # to be parallelized with dask
-> 1077 dump_to_store(
1078 dataset, store, writer, encoding=encoding, unlimited_dims=unlimited_dims
1079 )

 ~/anaconda3/lib/python3.8/site-packages/xarray/backends/api.py in dump_to_store(dataset, store, writer, encoder, encoding,
 

неограниченные возможности)
1122 переменные, attrs = кодер(переменные, attrs)
1123
-> 1124 store.store(переменные, attrs, check_encoding, писатель, неограниченные_димы=неограниченные_димы)
1125
1126

 ~/anaconda3/lib/python3.8/site-packages/xarray/backends/common.py in store(self, variables, attributes, check_encoding_set, writer,
 

неограниченные возможности)
260 писатель = ArrayWriter()
261
—> 262 переменные, атрибуты = self.кодирование(переменные, атрибуты)
263
264 self.set_attributes(attributes)

 ~/anaconda3/lib/python3.8/site-packages/xarray/backends/common.py in encode(self, variables, attributes)
    349         # All NetCDF files get CF encoded by default, without this attempting
    350         # to write times, for example, would fail.
--> 351         variables, attributes = cf_encoder(variables, attributes)
    352         variables = {k: self.encode_variable(v) for k, v in variables.items()}
    353         attributes = {k: self.encode_attribute(v) for k, v in attributes.items()}

~/anaconda3/lib/python3.8/site-packages/xarray/conventions.py in cf_encoder(variables, attributes)
    853     _update_bounds_encoding(variables)
    854 
--> 855     new_vars = {k: encode_cf_variable(v, name=k) for k, v in variables.items()}
    856 
    857     # Remove attrs from bounds variables (issue #2921)

~/anaconda3/lib/python3.8/site-packages/xarray/conventions.py in <dictcomp>(.0)
    853     _update_bounds_encoding(variables)
    854 
--> 855     new_vars = {k: encode_cf_variable(v, name=k) for k, v in variables.items()}
    856 
    857     # Remove attrs from bounds variables (issue #2921)

~/anaconda3/lib/python3.8/site-packages/xarray/conventions.py in encode_cf_variable(var, needs_copy, name)
    267         variables.UnsignedIntegerCoder(),
    268     ]:
--> 269         var = coder.encode(var, name=name)
    270 
    271     # TODO(shoyer): convert all of these to use coders, too:

~/anaconda3/lib/python3.8/site-packages/xarray/coding/times.py in encode(self, variable, name)
    511             variable
    512         ):
--> 513             (data, units, calendar) = encode_cf_datetime(
    514                 data, encoding.pop("units", None), encoding.pop("calendar", None)
    515             )

~/anaconda3/lib/python3.8/site-packages/xarray/coding/times.py in encode_cf_datetime(dates, units, calendar)
    449         units = infer_datetime_units(dates)
    450     else:
--> 451         units = _cleanup_netcdf_time_units(units)
    452 
    453     if calendar is None:

~/anaconda3/lib/python3.8/site-packages/xarray/coding/times.py in _cleanup_netcdf_time_units(units)
    402     delta, ref_date = _unpack_netcdf_time_units(units)
    403     try:
--> 404         units = "{} since {}".format(delta, format_timestamp(ref_date))
    405     except OutOfBoundsDatetime:
    406         # don't worry about reifying the units if they're out of bounds

~/anaconda3/lib/python3.8/site-packages/xarray/core/formatting.py in format_timestamp(t)
    102     # Timestamp is only valid for 1678 to 2262
    103     try:
--> 104         datetime_str = str(pd.Timestamp(t))
    105     except OutOfBoundsDatetime:
    106         datetime_str = str(t)

pandas/_libs/tslibs/timestamps.pyx in pandas._libs.tslibs.timestamps.Timestamp.__new__()

pandas/_libs/tslibs/conversion.pyx in pandas._libs.tslibs.conversion.convert_to_tsobject()

pandas/_libs/tslibs/conversion.pyx in pandas._libs.tslibs.conversion._convert_str_to_tsobject()

ValueError: could not convert string to Timestamp
 

Как решить эту проблему (возможно, с помощью CFTimeIndex)?

Спасибо.

Ответ №1:

Вы должны преобразовать свой xarray.DataArray объект в a xarray.Dataset .

Это очень просто:

 xarray.Dataset(dO18Buton).to_netcdf('dO18Buton.nc', engine='netcdf4')

 

Комментарии:

1. Я получил эту ошибку, выполнив эту команду: TypeError: unhashable type: 'DataArray

2. Когда я конвертировал в объект набора данных: dO18Buton.to_dataset().to_netcdf() . Это вызывает аналогичную ошибку: Ошибка alueError: не удалось преобразовать строку в метку времени