将来,您也许可以通过使用cftime 对象创建日期轴来做到这一点,但就目前而言,outstanding issue in xarray 不允许您编写包含此类对象的 netCDF 文件。
但是,即使您可以保存此类对象,最简单和最简洁的方法仍然是手动将该轴定义为具有某些单位的整数数组。
import numpy as np
import xarray as xr
days = np.asarray(range(100*365))
ds = xr.Dataset(
{'time': (['time'], days, {'units': 'days since 2200-01-01 0:0:0'})}
)
print(ds['time'][-1]
ds.to_netcdf('test.nc')
ds = xr.open_dataset('test.nc')
print(ds['time'][-1])
给出输出
<xarray.DataArray 'time' ()>
array(36499)
Coordinates:
time int64 36499
Attributes:
units: days since 2200-01-01 0:0:0
紧随其后
<xarray.DataArray 'time' ()>
array(datetime.datetime(2299, 12, 7, 0, 0), dtype=object)
Coordinates:
time object 2299-12-07
请注意,当您重新打开数据集时,xarray 会自动对其进行解码。
您使用的“单位”属性应遵循CF conventions 的时间坐标。您可以根据需要将“天”替换为“小时”、“分钟”或“秒”。
这确实需要您手动计算所需的整数,如果您的时间轴以年为单位,这主要是困难的(因为“年”不是定义的时间度量单位,它的长度会因闰年而异)。如果是这种情况,您可以使用以下内容:
import cftime
# replace this to use a different calendar
Datetime = cftime.DatetimeProlepticGregorian
# make your list of Datetime objects
time_list = []
month = day = 1
hour = minute = second = 0
for year in range(2200, 2300, 1):
time_list.append(Datetime(year, month, day, hour, minute, second))
# this will convert them into a time axis, here in units of
# 'days since 2200-01-01 0:0:0'
seconds_in_day = 60*60*24
day_list = []
for dt in time_list:
time_since_2200 = dt - Datetime(2200, month, day, hour, minute, second)
day_list.append(int(time_since_2200.total_seconds() / seconds_in_day))
您可以使用不同的cftime 类(例如cftime.DatetimeJulian 或cftime.DatetimeNoLeap)来使用不同的日历。应修改此代码以提供正确的time_list 供您使用。您还可以在其他时间单位中将seconds_in_day 切换为秒(并将该单位提供给xr.Dataset 调用)。