如何防止 xarray 将时间偏移量转换为绝对日期时间
How to prevent xarray from converting time offsets to absolute datetimes
我有一个相当标准的天气数据集,有 5 个维度:参考时间、预报时间、z、y 和 x。预测时间是相对于参考时间的偏移量。每个参考时间数据集作为一个文件保存到磁盘。我想打开整个多文件数据集并让预测维度按偏移量对齐,但 xarray 会自动转换并按绝对时间对齐预测维度。
有几个理由比绝对日期时间更喜欢时间偏移。使用绝对时间极大地增加了数据集的逻辑形状,因为只有某些预测对每个参考时间有效。这种增加的形状导致数据集大部分为 nan
,任何用户都必须通过外部方式了解该有效性。通过偏移量对齐预测使数据集更具自我描述性。
一个具体的例子
我正在使用 NAM-NMM 预报。预报作为一系列 GRIB 文件每 6 小时发布一次,每个预报小时一个。我首先使用 PyNIO 引擎和 select 我想要保留的变量和地理区域将每个 GRIB 文件作为数据集打开。然后我将参考时间添加为日期时间坐标,将预测小时添加为整数坐标,并将 units
属性设置为 'hours since {reftime}'
。 (设置单位是 Panoply 中正确可视化所必需的。)然后我将所有数据集沿着预测维度连接相同参考时间,并将结果作为 netCDF 保存到磁盘。
Here is a gist 正在发生的事情和 ncdump
.
的输出
这很好用。我可以 select 沿预测维度使用小时偏移量。我可以在 Panoply 中可视化数据集。 ncdump
.
中的预测维度看起来是正确的
但是当我重新打开 netCDF 时,xarray 会自动将预测维度转换为绝对日期时间。当我打开多个文件时,预测维度按绝对时间而不是参考时间对齐。
如何防止 xarray 将预测维度解释为绝对日期时间?
在 xarray.open_dataset
或 xarray.open_mfdataset
中设置 decode_times=False
将禁用解析时间。这应该允许您在调用 xr.decode_cf()
之前以任何必要的方式自定义内容,例如
raw = xr.open_mfdataset(my_files, decode_cf=False)
raw.forecast.attrs['units'] = 'hours'
ds = xr.decode_cf(raw)
特别是,如果您将 "units" 属性设置为像 "hours" 这样的时间单位,xarray 会将您的 "forecast" 变量解码为 np.timedelta64
。这将允许您沿相同的轴合并多个文件。
我怀疑 Panoply 也可以处理这样的单位,因为时间间隔单位适用于这个变量,我认为根据 CF Standard names.[=17=,它对应于 "forecast_period" ]
我有一个相当标准的天气数据集,有 5 个维度:参考时间、预报时间、z、y 和 x。预测时间是相对于参考时间的偏移量。每个参考时间数据集作为一个文件保存到磁盘。我想打开整个多文件数据集并让预测维度按偏移量对齐,但 xarray 会自动转换并按绝对时间对齐预测维度。
有几个理由比绝对日期时间更喜欢时间偏移。使用绝对时间极大地增加了数据集的逻辑形状,因为只有某些预测对每个参考时间有效。这种增加的形状导致数据集大部分为 nan
,任何用户都必须通过外部方式了解该有效性。通过偏移量对齐预测使数据集更具自我描述性。
一个具体的例子
我正在使用 NAM-NMM 预报。预报作为一系列 GRIB 文件每 6 小时发布一次,每个预报小时一个。我首先使用 PyNIO 引擎和 select 我想要保留的变量和地理区域将每个 GRIB 文件作为数据集打开。然后我将参考时间添加为日期时间坐标,将预测小时添加为整数坐标,并将 units
属性设置为 'hours since {reftime}'
。 (设置单位是 Panoply 中正确可视化所必需的。)然后我将所有数据集沿着预测维度连接相同参考时间,并将结果作为 netCDF 保存到磁盘。
Here is a gist 正在发生的事情和 ncdump
.
这很好用。我可以 select 沿预测维度使用小时偏移量。我可以在 Panoply 中可视化数据集。 ncdump
.
但是当我重新打开 netCDF 时,xarray 会自动将预测维度转换为绝对日期时间。当我打开多个文件时,预测维度按绝对时间而不是参考时间对齐。
如何防止 xarray 将预测维度解释为绝对日期时间?
在 xarray.open_dataset
或 xarray.open_mfdataset
中设置 decode_times=False
将禁用解析时间。这应该允许您在调用 xr.decode_cf()
之前以任何必要的方式自定义内容,例如
raw = xr.open_mfdataset(my_files, decode_cf=False)
raw.forecast.attrs['units'] = 'hours'
ds = xr.decode_cf(raw)
特别是,如果您将 "units" 属性设置为像 "hours" 这样的时间单位,xarray 会将您的 "forecast" 变量解码为 np.timedelta64
。这将允许您沿相同的轴合并多个文件。
我怀疑 Panoply 也可以处理这样的单位,因为时间间隔单位适用于这个变量,我认为根据 CF Standard names.[=17=,它对应于 "forecast_period" ]