Python 3.x 使用两个坐标给出的尺寸通过Xarray保存NetCDF

Python 3.x 使用两个坐标给出的尺寸通过Xarray保存NetCDF,python-3.x,netcdf,geopandas,python-xarray,Python 3.x,Netcdf,Geopandas,Python Xarray,我在geopandas中有地理信息。我有一个函数,可以通过xarray将该信息保存到netcdf,如下所示 def write_ncfile(name, new_model, variables): ## Distinct latitudes lats=new_model.drop_duplicates(["ilat"], keep="first").geometry.y.values ## Distinct Longitudes

我在geopandas中有地理信息。我有一个函数,可以通过
xarray
将该信息保存到netcdf,如下所示

def write_ncfile(name, new_model, variables):
    ## Distinct latitudes
    lats=new_model.drop_duplicates(["ilat"], keep="first").geometry.y.values
    ## Distinct Longitudes
    lons=new_model.drop_duplicates(["ilon"], keep="first").geometry.x.values

    ## Temporal store for DataArrays
    temporal_dataset = {}

    ## Dimensions and coordinates
    dims = ('lat', 'lon')
    coords = dict(lat=lats, lon=lons)

    ## Variables to save
    for variable in variables:
        bcvar=new_model[variable].values
        ## Reshapes data to have sahpe of lats and lons
        bcvar=np.reshape(bcvar, (-1, len(lons)))
        ds = xr.DataArray(bcvar, dims=dims, coords=coords)
        ds.attrs['long_name'] = descriptions[variable] 
        ds.attrs['_FillValue'] = 0
        temporal_dataset[variable] = ds
    ## Create DataSet
    DT=xr.Dataset(temporal_dataset)

    ## Save to file
    makedirs(name, exist_ok = True)
    filename="%s/%s.nc"%(name, name)
    DT.to_netcdf(filename, format="NETCDF4_CLASSIC")

    return None
如果基线地理网格是正方形的(lat-lon投影),那么这个代码工作得非常好,但是现在如果投影不是正方形的(ex-lambert),那么我需要将尺寸定义为2d数组而不是1d数组。我不知道该怎么做

我正试图在
ncdump

dimensions:
lat:dim_lat
lon:dim_lon
variables:
double lat(lat, lon)
double lon(lat, lon)
double var1(lat, lon)
double var2(lat, lon)
当前代码将其另存为

dimensions:
lat:dim_lat
lon:dim_lon
variables:
double lat(lat)
double lon(lon)
double var1(lat, lon)
double var2(lat, lon)
我怎样才能改变这个


示例gdf:

     ilat  ilon                   geometry            d_p         T_P          d_v         T_V              
22     0     0  POINT (-70.95000 -33.30000)      0.000000           0     0.000000           0              
0      0     1  POINT (-70.85000 -33.30000)    383.862700       39674   120.439438       12448              
1      0     2  POINT (-70.75000 -33.30000)    327.639330       33863   112.502638       11628              
2      0     3  POINT (-70.65000 -33.30000)    320.808104       33157    96.602750        9984              
3      0     4  POINT (-70.55000 -33.30000)    415.217240       42915    99.144774       10247              
23     1     0  POINT (-70.95000 -33.40000)      0.000000           0     0.000000           0              
4      1     1  POINT (-70.85000 -33.40000)     56.055971        5787    16.853605       17310              
5      1     2  POINT (-70.75000 -33.40000)   6686.807845      690341  1992.373592      205691            
6      1     3  POINT (-70.65000 -33.40000)   8812.040534      909749  3512.456618      362623              
7      1     4  POINT (-70.55000 -33.40000)   5203.112762      537166  2015.376536      208066              
24     2     0  POINT (-70.95000 -33.50000)      0.000000           0     0.000000           0              
8      2     1  POINT (-70.85000 -33.50000)    133.485233       13765    40.937021        4222              
9      2     2  POINT (-70.75000 -33.50000)   7358.668562      758846  2309.069300      238118              
10     2     3  POINT (-70.65000 -33.50000)  10420.377036     1074578  3668.947758      378352              
11     2     4  POINT (-70.55000 -33.50000)   6166.780423      635935  2047.500621      211144              
12     3     0  POINT (-70.95000 -33.60000)     71.933395       74010    21.287101        2193              
13     3     1  POINT (-70.85000 -33.60000)   1154.803477      118952   373.474444       38470              
14     3     2  POINT (-70.75000 -33.60000)   1512.189352      155764   466.310819       48033              
15     3     3  POINT (-70.65000 -33.60000)   7160.093545      737532  2095.296251      215828              
16     3     4  POINT (-70.55000 -33.60000)   4870.217943      501661  1494.220152      153914              
17     4     0  POINT (-70.95000 -33.70000)    767.033734       78919   241.884877       24887              
18     4     1  POINT (-70.85000 -33.70000)    163.023696       16773    48.526857        4993              
19     4     2  POINT (-70.75000 -33.70000)    632.011798       65027   207.326845       21332              
20     4     3  POINT (-70.65000 -33.70000)     93.053338        9574    27.787137        2859
而函数的使用将是

write_ncfile("Trial", gdf, ["d_p", "d_v"])

在上面的示例中,使用上面的代码可以很好地保存信息,但我需要对其进行概括,以便在网格不是正方形网格时它可以工作。

我也遇到了同样的问题,xarray在这一点上不是很直观。创建具有正确维度的
DataArray
的解决方案(注意,这是一个3D示例):

因此,代码中的循环应该如下所示:

    coords = {
            "latitude": (["lon", "lat"], latitude_grid),
            "longitude": (["lon", "lat"], longitude_grid)}
    dims = ['lon', 'lat']
    for variable in variables:
        bcvar=new_model[variable].values
        ## Reshapes data to have sahpe of lats and lons
        bcvar=np.reshape(bcvar, (-1, len(lons)))
        ds = xr.DataArray(bcvar, dims=dims, coords=coords)
        ds.attrs['long_name'] = descriptions[variable] 
        ds.attrs['_FillValue'] = 0
        temporal_dataset[variable] = ds

请根据您的最终跑步解决方案调整此选项。

我也有同样的问题,xarray在这一点上不是很直观。创建具有正确维度的
DataArray
的解决方案(注意,这是一个3D示例):

因此,代码中的循环应该如下所示:

    coords = {
            "latitude": (["lon", "lat"], latitude_grid),
            "longitude": (["lon", "lat"], longitude_grid)}
    dims = ['lon', 'lat']
    for variable in variables:
        bcvar=new_model[variable].values
        ## Reshapes data to have sahpe of lats and lons
        bcvar=np.reshape(bcvar, (-1, len(lons)))
        ds = xr.DataArray(bcvar, dims=dims, coords=coords)
        ds.attrs['long_name'] = descriptions[variable] 
        ds.attrs['_FillValue'] = 0
        temporal_dataset[variable] = ds
可以根据您的最终跑步解决方案随意调整此选项