有没有办法使用xarray创建时间维度超过2263年的netCDF文件?
以下是如何创建netCDF玩具数据集http://xarray.pydata.org/en/stable/time-series.html
但是时间维度有一种pandas日期时间索引,并且这些索引不会超出2263,如下所示: https://github.com/pandas-dev/pandas/issues/13346
答案 0 :(得分:2)
将来,您可以通过使用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会自动解码它。
&#39;单位&#39;您使用的属性应遵循CF conventions的时间坐标。你可以替换“天”。 &#39;小时&#39;,&#39;分钟&#39;或&#39;秒&#39;如你所知。
这确实需要您手动计算所需的整数,如果您的时间轴是以年为单位,这主要是困难的(因为&#34;年&#34;不是定义的时间度量单位,它的长度取决于闰年)。如果是这种情况,您可以使用以下内容:
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
来电。)
答案 1 :(得分:0)
问题可能是xarray可选择在nettime.datetime范围之外的时间使用netcdftime,但pandas不会。所以,即使安装了netcdftime,这个例子也不会起作用
import numpy as np
import pandas as pd
import xarray as xr
data = np.random.rand(4, 3)
locs = ['IA', 'IL', 'IN']
times = pd.date_range('2318-04-25', periods=4)
da = xr.DataArray(data, coords=[times, locs], dims=['time', 'space'])
当您尝试创建pandas date_range时,这将失败。即使提供netcdftime.datetime作为pd.date_range()的第一个参数也不起作用,因为pandas想要转换为自己的,有限的日期时间类型。
相反,您需要直接指定xarray的时间。不幸的是,这是我对netcdf的了解让我失望的地方,但我可以给你一些大纲,也许你可以从这里得到它。
有许多方法可以在DataArray参数中指定日期。您需要以netcdftime.datetime类型为基础创建自己的日期范围。您可以使用netcdftime.date2index()创建日期索引,并使用它代替上面示例中的pandas DateIndex。
您应该发布显示问题的示例代码。我已经假设你正在尝试创建一个DataArray,但也许这不是你所拥有的问题。