【问题标题】:xarray DataArray failed to convert to netcdf filexarray DataArray 无法转换为 netcdf 文件
【发布时间】:2021-10-29 12:39:39
【问题描述】:

我要转换 DataArray 对象:

print(dO18Buton)

数组([[[-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 * 经度(经度) float64 120.0 121.9 123.8 125.6 * 纬度(纬度) float64 -6.667 -4.762 -2.857 属性: 描述:do18precip 单位:每百万

使用to_netcdf() 方法进入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,计算,invalid_netcdf) 1898 从 ..backends.api 导入 to_netcdf 1899 -> 1900 返回到_netcdf( 1901年的自己, 1902路径,

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

编码、unlimited_dims、计算、多文件、invalid_netcdf) 1075 # TODO: 允许这项工作(设置用于写入数组数据的文件) 第1076章 -> 1077 转储到存储( 1078 数据集,存储,写入器,编码=编码,unlimited_dims=unlimited_dims 第1079章

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

unlimited_dims) 1122 个变量,attrs = 编码器(变量,attrs) 1123 -> 1124 store.store(变量,attrs,check_encoding,writer,unlimited_dims=unlimited_dims) 1125 第1126章

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

unlimited_dims) 260 作家 = ArrayWriter() 261 --> 262 个变量,属性 = self.encode(variables, attributes) 263 264 self.set_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)?

谢谢。

【问题讨论】:

    标签: netcdf python-xarray netcdf4


    【解决方案1】:

    您必须将您的 xarray.DataArray 对象转换为 xarray.Dataset

    这很简单:

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

    【讨论】:

    • 运行此命令时出现此错误:TypeError: unhashable type: 'DataArray
    • 当我转换为 DataSet 对象时:dO18Buton.to_dataset().to_netcdf()。它引发了类似的错误:alueError: could not convert string to Timestamp
    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 2021-06-21
    • 2018-04-07
    • 1970-01-01
    • 2021-01-22
    • 2021-06-02
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多