#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: не удалось преобразовать строку в метку времени