设置
假设我有一个NetCDF文件,该文件存储了许多由date
,longitudes
和latitudes
索引的栅格,并以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>
答案 0 :(得分:1)
完成一些工作后,我有了使用netCDF4-python
的解决方法,如果您正在寻找一种不立即将整个netCDF加载到内存中的方法,该方法将非常有用。
原始的netCDF文件已通过XArray
处理,但是我为此特定操作退回到netCDF4
。
下面是一个示例,其中我想向 unlimited 变量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)
希望它对其他人有用。
答案 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>