首页 > 解决方案 > 如何跨多个 x、y 和时间值对 X 数组 netcdf 数据集进行切片?

问题描述

我创建了一个函数来使用 X 数组为单个 x、y 和时间选择 netcdf 数据,但是如何输入多个 x、y、时间值(即一条路线)并从 netcdf 返回值?即一系列 x,y,time 数组的风速。

我能想到的唯一方法是遍历我的 x,y,time 数组并每次运行该函数,但这似乎非常低效。关于最佳方法的任何建议?

我的输入数据集是:

| x y timestamp | | 0 77.49316 6.320333 2018-08-01 00:10:00+00:00 | 1 77.64450 6.287833 2018-08-01 00:44:00+00:00 | 2 77.98483 6.202500 2018-08-01 02:02:00+00:00

我想将 netcdf 变量作为列返回。下面是我为单个位置选择的代码。

# Scan the folder for netcdf datasets and return variables
def listmodelvars(model):
    varlist = xr.open_mfdataset(os.path.join(model, '*.nc'))
    print(varlist.data_vars.keys())
    return varlist    

ds = listmodelvars(ncep_model)
KeysView(Data variables:
    tmp2m     (time, latitude, longitude) float64 dask.array<shape=(270, 311, 720), chunksize=(9, 311, 720)>
    rh2m      (time, latitude, longitude) float64 dask.array<shape=(270, 311, 720), chunksize=(9, 311, 720)>
    tmpsfc    (time, latitude, longitude) float64 dask.array<shape=(270, 311, 720), chunksize=(9, 311, 720)>
    pratesfc  (time, latitude, longitude) float64 dask.array<shape=(270, 311, 720), chunksize=(9, 311, 720)>
    prmslmsl  (time, latitude, longitude) float64 dask.array<shape=(270, 311, 720), chunksize=(9, 311, 720)>
    ugrd10m   (time, latitude, longitude) float64 dask.array<shape=(270, 311, 720), chunksize=(9, 311, 720)>
    vgrd10m   (time, latitude, longitude) float64 dask.array<shape=(270, 311, 720), chunksize=(9, 311, 720)>)
In [4]:

# Variables    
parameter = 'tmp2m'
start_date = '2018-08-01'
end_date = '2018-08-31'
lat = 0
lon = 0    

# Define a function to return time-series data for a single location    
def array_2d(model, parameter, start_date, end_date, lat, lon):
    data = xr.open_mfdataset(os.path.join(str(model), '*.nc'))[str(parameter)].sel(
        time=slice(str(start_date) + 'T00:00:00', str(end_date) + 'T00:00:00'), 
        latitude=lat, longitude=lon)
    return data    

data_2d = array_2d(ncep_model, parameter, start_date, end_date, lat, lon)

标签: pythonnetcdfpython-xarray

解决方案


推荐阅读