2017-09-20 26 views
1

netCDF 파일에서 다른 소스의 지오메트리와 일부 기하 연산을 수행해야합니다. 따라서 다른 소스의 도형 (shapely.geometry.Polygon)을 geopandas.GeoDataFrame에 저장합니다.NetCDF 데이터를 GeoDataFrame에 저장하십시오.

다음은 netCDF 파일을 GeoDataFrame으로 읽는 것입니다. 조리법은 분명합니다 : xarray으로 netCDF을 읽고 pandas.DataFrame에 저장하고 추출 된 위도/경도 데이터에 shapely.geometry.Point 연산을 수행하고 GeoDataFrame으로 변환합니다.

이후에는 지오메트리 연산자를 사용하여 통계를 작성하겠습니다.


내가 xarray (see here)와 netCDF 파일

import xarray as xr 
dnc = xr.open_dataset(ff) 
df = dnc.to_dataframe() 

을 읽을 때 나는 012에서

>>>> dnc 
<xarray.Dataset> 
Dimensions: (lat: 16801, lon: 19201) 
Coordinates: 
    * lat  (lat) float32 -32.0 -31.9992 -31.9983 -31.9975 -31.9967 ... 
    * lon  (lon) float32 -73.0 -72.9992 -72.9983 -72.9975 -72.9967 ... 
Data variables: 
    hgt  (lat, lon) int16 0 0 0 4 0 5 0 9 9 8 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 

>>> dnc.hgt.size 
322596001 
>>> dnc.lat.size 
16801 
>>> dnc.lon.size 
19201 

>>> df.head() 
        hgt 
lat lon     
-32.0 -73.000000 0 
     -72.999168 0 
     -72.998337 0 
     -72.997498 4 
     -72.996666 0 

를 얻을 수latlon에 액세스 할 수 없습니다. 부분적으로 빈 열 lat을 이해하는 데 문제가 있습니다. 그래서 shapely.geometry.Point((lon, lat))lonlat의 모든 조합에 대해 dnc에서 수행되어야한다고 생각합니다. 그게 맞습니까? 어떤 아이디어를 코드하는 방법?

+0

'df'의 색인은'Pandas.MultiIndex'입니다. 이 작업을 수행하는 방법은 여러 가지가 있습니다.'df.reset_index()'를 사용해보십시오. – jhamman

답변

0

의견에서 언급 한 @jhamman과 마찬가지로 라트와 lons는 팬더 프레임의 색인입니다. 그래서

import pandas as pd 
import geopandas as gpd 
from shapely.geometry import Point 
from io import StringIO 

s = StringIO('''    
    lat,lon,hgt     
    -32.0,-73.000000,0 
    -32.0,-72.999168,0 
    -32.0,-72.998337,0 
    -32.0,-72.997498,4 
    -32.0,-72.996666,0 
    ''') 

    df = pd.read_csv(s) 
    df = df.set_index(['lat', 'lon']) 

로 시작하는 것은 우리가 먼저

df = df.reset_index()

은 우리가 우리의 형상을 만듭니다 프레임의 인덱스를 재설정 할 수 있습니다.

geom = [Point(x,y) for x, y in zip(df['lon'], df['lat'])]

지금 우리가 GeoPandas GeoDataFrame

gdf = gpd.GeoDataFrame(df, geometry=geom) 
print(gdf.head()) 
    lat  lon hgt           geometry 
0 -32.0 -73.000000      0     POINT (-73 -32) 
1 -32.0 -72.999168      0 POINT (-72.99916800000001 -32) 
2 -32.0 -72.998337      0 POINT (-72.99833700000001 -32) 
3 -32.0 -72.997498      4 POINT (-72.99749799999999 -32) 
4 -32.0 -72.996666      0   POINT (-72.996666 -32) 
+0

감사합니다. @ bob-haffner, @jhamman,'df.reset_index()'가 잘 작동했습니다.엄청난 양의 데이터로 인해 색인이 재설정되는 동안 컴퓨터가 스와핑되었습니다. 다음주 기 기학 작전에 대해 의견을 나눌 것입니다. – TSchonn

+0

좋아요, 어쩌면 첫 번째 장소에서 색인으로 lat, lon을 설정하지 않도록 데이터 프레임을 만드는 방식을 변경하여 재설정을 피할 수있는 방법이 있습니다 (xarray.Dataset -> DataFrame)? –

0

우리의 팬더의 DataFrame 변환 목록 빌려와 즉, 맵시있는 점 그것은 내 스와핑 메모리에 대한 몇 가지 솔루션 (8 GB의 시도 더 오래 걸렸다). 마지막으로 내가 dask을 시도,하지만 내 방식은 여전히 ​​올바른되지 않습니다 :

for f in nc_files: 
ff = os.path.join(nc_path, f) 
try: 
    dnc = xr.open_dataset(ff, chunks={'lat': 400, 'lon': 400}) 
    df = dnc.to_dataframe() 
    df = df.reset_index() 
    geom = [Point(x,y) for x, y in zip(df['lon'], df['lat'])] 
    gdf = gpd.GeoDataFrame(df, geometry=geom) 
    print(gdf.head()) 
except Exception as e: 
    print(e) 

위에서 언급 한 바와 같이, 파일이 크다 :

>>> dnc.hgt.size 
322596001 
>>> dnc.lat.size 
16801 
>>> dnc.lon.size 
19201 

은에서 직접 geometry.Point을 만들 수있는 또 다른 방법이 있나요 netCDF-File?