В будущем вы, возможно, сможете сделать это, создав ось дат с использованием cftime
объектов, но в настоящее время существует нерешенная проблема в 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 автоматически его декодирует.
Используемый атрибут 'units' должен соответствовать условиям CF. для временных координат. Вы можете заменить «дни» на «часы», «минуты» или «секунды» по своему усмотрению.
Это требует, чтобы вы вручную вычисляли необходимые целые числа, что в основном сложно, если ваша ось времени указана в годах (поскольку «год» не является определенной единицей измерения времени, его длина варьируется в зависимости от високосных лет). Если это так, вы можете использовать что-то вроде следующего:
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
).
person
Jeremy McGibbon
schedule
25.04.2018
pip install cftime
- person user308827   schedule 24.04.2018