建立
假设我有一个NetCDF文件,存储由date
,longitudes
和latitudes
索引的多个栅格,在内存中加载名为“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>
经过一些工作,我有一个使用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)
希望它对他人有用。
尝试使用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>