XArray:将数据的“层”添加到NetCDF

时间:2019-03-28 15:50:43

标签: python netcdf python-xarray

设置

假设我有一个NetCDF文件,该文件存储了许多由datelongitudeslatitudes索引的栅格,并以XArray的名称加载了“ stack”到内存中:

<xarray.Dataset>
Dimensions:   (date: 1, lat: 2000, lon: 7200)
Coordinates:
  * date      (date) datetime64[ns] 2000-01-01
  * lat       (lat) float64 49.97 49.92 49.87 49.82 ... -49.88 -49.93 -49.98
  * lon       (lon) float64 -180.0 -179.9 -179.9 -179.8 ... 179.9 179.9 180.0
Data variables:
    rainfall  (date, lat, lon) float64 ...

任务

将新的date添加到堆栈中。

方法

我的方法是从栅格中创建一个Dataset“新”索引,其索引与所加载的NetCDF相同:

xr.DataArray(
     <some numpy data>,
     dims=['date', 'lat', 'lon'],
     coords={
         'date': [<some datetime64>],
         'lat': <same list of latitudes>,
         'lon': <same list of longitudes>
     },
     name='rainfall'
).to_dataset()

然后串联:

merged = xr.concat([stack, new], dim='date')

这行得通,但不是很优雅,并且是XArray的新手,也许有更好的方法进行此操作,例如,仅使用一些索引例程,例如添加新的date和数据;像这样:

stack[<new_date>] = <some numpy data>

2 个答案:

答案 0 :(得分:1)

完成一些工作后,我有了使用netCDF4-python的解决方法,如果您正在寻找一种不立即将整个netCDF加载到内存中的方法,该方法将非常有用。

原始的netCDF文件已通过XArray处理,但是我为此特定操作退回到netCDF4

下面是一个示例,其中我想向 unlimited 变量date添加时间步。其他两个变量是经度纬度

首先,我使用netCDF4打开netCDF,并读取将要扩展的变量datedata

d = Dataset('dataset.nc', 'a')
dt = d.variables['date']
data = d.variables['data']

之后,我将numpy数组添加到切片中:

data[len(dt):len(dt)+1, :,:] = <some numpy data>

最后添加额外的时间步骤:

from datetime import datetime
from netCDF4 import date2num
dt[len(dt)-1] = date2num(datetime(<year>, <month>, <day>), dt.units)

希望它对其他人有用。

答案 1 :(得分:0)

尝试使用reindex扩展原始DataArray,然后扩展assign value with indexing

extra_date = <some datetime64>
date_extended = np.concatenate([stack.date, [extra_date]]
# this will extend the arrays and place NaNs in the new position
stack_extended = stack.reindex({'date': date_extended})
# now assign to that position
stack_extended.loc[dict(date=extra_data)] = <some numpy data>