XArray:向NetCDF添加“层”数据

问题描述 投票:3回答:2

建立

假设我有一个NetCDF文件,存储由datelongitudeslatitudes索引的多个栅格,在内存中加载名为“stack”的XArray

<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“new”,其索引与加载的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>
python netcdf python-xarray
2个回答
1
投票

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

原始的netCDF文件使用XArray处理,但我回退到netCDF4进行此特定操作。

下面是一个例子,我想在无限变量date中添加一个时间步长。其他两个变量是经度和纬度。

首先,我使用netCDF4打开netCDF并读取我将扩展的变量date以及data

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)

希望它对他人有用。


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>
© www.soinside.com 2019 - 2024. All rights reserved.