使用没有日期的时间作为 xarray 中的一维

Posted

技术标签:

【中文标题】使用没有日期的时间作为 xarray 中的一维【英文标题】:use time without date as one dimension in xarray 【发布时间】:2022-01-12 03:52:53 【问题描述】:

我有一个 xarray.DataArray,我成功地将一个暗淡设置为一天的时间。

tmp.dims
('ITEM', 'DATE', 'TIME', 'CODE')
tmp.TIME
<xarray.DataArray 'TIME' (TIME: 15)>
array([datetime.time(14, 15), datetime.time(14, 16), datetime.time(14, 17),
       datetime.time(14, 18), datetime.time(14, 19), datetime.time(14, 20),
       datetime.time(14, 21), datetime.time(14, 22), datetime.time(14, 23),
       datetime.time(14, 24), datetime.time(14, 25), datetime.time(14, 26),
       datetime.time(14, 27), datetime.time(14, 28), datetime.time(14, 29)],
      dtype=object)
tmp.TIME.values[0]
datetime.time(14, 15)

但我无法将此 xarray 保存到此错误中:

tmp.to_netcdf('/sdata/user/tsu/tmp/srpd.nc')
        *** ValueError: unable to infer dtype on variable 'TIME'; xarray cannot serialize arbitrary Python objects

这样使用datetime.time有错吗?

【问题讨论】:

欢迎堆栈溢出!请format python code as code blocks 不可执行 javascript sn-ps(我已经修复了它,所以不用担心),并且当询问错误时,请务必包含full traceback - 它们为我们调试提供了很多有用的信息。您可以使用 numpy 或 pandas 日期时间数组,而不是使用日期时间对象列表。查看pandas docs on working with time series data - 您可能正在寻找时间增量。 【参考方案1】:

不要使用 python datetime 对象的列表,而是使用来自 numpy 或 pandas 的 timedelta 数组。请参阅working with time series data 上的 pandas 文档。

对于按小时而不是特定日期索引的数据,我建议使用pd.to_timedelta,如下例所示:

In [9]: da = xr.DataArray(
   ...:     np.ones(16).reshape(4, 4),
   ...:     dims=['x', 'hour'],
   ...:     coords=[range(4), pd.to_timedelta(range(4), unit='h')],
   ...: )
   ...:

In [10]: da
Out[10]:
<xarray.DataArray (x: 4, hour: 4)>
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
Coordinates:
  * x        (x) int64 0 1 2 3
  * hour     (hour) timedelta64[ns] 00:00:00 01:00:00 02:00:00 03:00:00

In [11]: da.hour
Out[11]:
<xarray.DataArray 'hour' (hour: 4)>
array([             0,  3600000000000,  7200000000000, 10800000000000],
      dtype='timedelta64[ns]')
Coordinates:
  * hour     (hour) timedelta64[ns] 00:00:00 01:00:00 02:00:00 03:00:00

请注意,这可以毫无问题地写入 netCDF:

In [12]: da.to_dataset(name='myarr').to_netcdf('sample.nc')

In [13]: xr.open_dataset('sample.nc')
Out[13]:
<xarray.Dataset>
Dimensions:  (x: 4, hour: 4)
Coordinates:
  * x        (x) int64 0 1 2 3
  * hour     (hour) timedelta64[ns] 00:00:00 01:00:00 02:00:00 03:00:00
Data variables:
    myarr    (x, hour) float64 ...

【讨论】:

以上是关于使用没有日期的时间作为 xarray 中的一维的主要内容,如果未能解决你的问题,请参考以下文章

xarray--一维空间绘图学习记录

Python气象数据处理进阶之Xarray(6):数据重组与换形

如何将多个csv连接到xarray并定义坐标?

使用xarray python组合空间netcdf文件

数据可视化应用xarray 绘图可视化-多维数组绘图(附代码)

删除 xarray 中的重复时间