使用 Xarray 在 NetCDF 中将时间更新为 Proleptic Gregorian

Updating time as Proleptic Gregorian in a NetCDF using Xarray

我有一年的 6 小时 NetCDF 文件,但时间值已损坏,即;每个文件的 timedelta64[ns] 00:00:00。我的目标是纠正这一点并使用 xarrays 将其合并到一个组合文件中。该文件具有 CF 约定,时间采用 Proleptic Gregorian。

我尝试将时间轴值存储为时间戳,但在将其写回 .nc 格式时出现错误,提示 ValueError:未能阻止覆盖变量 'time' 上 attrs 中的现有关键日历。

我正在尝试将时间值更新为 01-01-1970 的秒数。它有效,但问题是当我读回保存的文件时,我希望时间显示在实际的 yyyy-mm-dd 中,以便我可以使用 .sel 方法快速浏览数据。

有没有更好的方法来编写我的输出文件,同时保持 Proleptic Gregorian 的标准约定,以便当我读回它时,我的时间轴自动在 yyyy-mm-dd 中,而不是将它从秒转换回yyyy-mm-dd格式每次读完。

import xarray as xr
big_ds = xr.open_mfdataset('path/*',   autoclose=True, concat_dim='time')
dt = pd.date_range(start=datetime(2000,1,1), end=datetime(2000,12,31,18), freq='6H')
big_ds.time.values = (dt - std_time).total_seconds()
big_ds.to_netcdf('outfile.nc')

test_ds = xr.open_dataset('outfile.nc')
test_ds.time
>><xarray.DataArray 'time' (time: 1464)>
array([9.466848e+08, 9.467064e+08, 9.467280e+08, ..., 9.782424e+08,
   9.782640e+08, 9.782856e+08])
Coordinates:
* time     (time) float64 9.467e+08 9.467e+08 ... 9.783e+08 9.783e+08
Attributes:
calendar:  proleptic_gregorian

简短的修复是向时间属性添加单位。

big_ds.time.attrs['units'] = 'Seconds since 01/01/1970 00:00:00 UTC'

因此,在读回数据时,xarray 足够智能,可以看到这一点并将以秒为单位存储的时间值转换为 datetime64[ns],以便可以将它们作为 yyyy-mm-dd

访问