2016-06-01 3 views
1

오스트레일리아의 일일 강우량 값을 포함하는 NetCDF 파일이 여러 개 있습니다 (매년 하나씩).Python의 날짜 값을 기준으로 여러 NetCDF 파일에서 래스터 추출

현재 원하는 날짜 목록이 들어있는 .csv 파일에서 원하는 특정 날짜를 추출 할 수 있습니다. 그런 다음이 파일을 매일 래스터 파일로 출력합니다.

그러나 현재 내가 갖고있는 스크립트로는 한 번에 1 년씩이 작업을 수행 할 수 있습니다. 필자는 파이썬에 상당히 익숙하지 않으며, .csv 파일의 날짜 목록뿐만 아니라 읽어 오는 NetCDF 파일을 변경하여 여러 번 스크립트를 다시 실행하기보다는 루프는 NetCDF의 목록을 읽을 것입니다.

NetCDF4와 같은 모듈은 모든 파일을 하나의 파일로 취급 할 수 있지만 많은 사람들이 다른 사람이 한 것을 읽었을지라도 나는 현명하지 않다는 것을 알고 있습니다. 여기

는 내가 지금까지 무엇을 가지고 :

import os, sys 
import arcpy 

# Check out any necessary licenses 
arcpy.CheckOutExtension("spatial") 
arcpy.env.overwriteOutput = True 

# Script arguments 
netCDF = "G:\\Gridded_rain\\DAILY\\netcdf\\Daily_analysis_V3" 
rainfall = "G:\\output_test\\r_" 

arcpy.env.workspace = netCDF 

# Read Date from csv file 
eveDate = open ("G:\\selectdate_TEST1.csv", "r") 
headerLine = eveDate.readline() 
valueList = headerLine.split(",") 
dateValueIndex = valueList.index("Date") 
eventList = [] 
for line in eveDate.readlines(): 
    segmenLine = line.split(",") 
    variable = "pre" 
    x_dimension = "lon" 
    y_dimension = "lat" 
    band_dimension = "" 
    #dimensionValues = "r_time 1900025" 

    valueSelectionMethod = "BY_VALUE" 
    outFile = "Pre" 
    # extract dimensionValues from csv file 
    arcpy.MakeNetCDFRasterLayer_md("pre.2011.nc", variable, x_dimension, y_dimension, outFile, band_dimension, segmenLine[dateValueIndex], valueSelectionMethod) 
    print "layer done" 
    #copy and save as raster tif file 
    arcpy.CopyRaster_management(outFile, rainfall + segmenLine[dateValueIndex] + ".tif" , "", "", "", "NONE", "NONE", "") 
    print "raster done" 

netCDF의 파일이 어떤 도움을 크게 감상 할 수

pre.2011.nc을 통해 pre.1900.nc에서 지정됩니다!

+0

'dateValueIndex'의 형식은 무엇입니까? 그리고 몇 가지 가치를 게시하십시오. – Serenity

+0

그래서 현재의 질문 산문에서 알 수 있듯이 인수를 처리하고이를 하드 코딩 된 리터럴'pre.2011.nc' 대신 변수로 사용하여 일치하는 netcdf 파일에 액세스하거나 다른 루프 수준 (외부)을 포함하려고합니다. (1900, 2012) : '와 같은 방식으로 진행된 다음 파일을 요약합니다. 공개 질문 : 매개 변수 파일도 일치해야합니까? 그걸 바탕으로 샘플을 줄까요? – Dilettant

답변

1

문제는 파이썬 명령 행 인수에 대해 정말 경우에 당신은 같은 것을 추가 할 수

import sys 
year = int(sys.argv[1]) 
nc_name = 'pre.%d.nc' % (year,) 

을 다음

가 다른 가능성이 제안하는 것입니다 귀하의 arcpy.MakeNetCDFRasterLayer_md 호출 filepathargument 등이 nc_name를 사용 댓글에서 하드 코드에 대해 다음과 같이 다른 레이어를 질문하십시오.

for year in range(1900, 2012): 
    nc_name = 'pre.%d.nc' % (year,) 

다음으로 arcpy.MakeNetCDFRasterLayer_md

+0

고마움 Dilettant ...하지만 당신의 첫 번째 제안을 시도했다 "AttributeError : '모듈'개체가 'args'속성이 없습니다"라는 오류가 함께 올랐다 "다음 범위 내 년 동안 퍼팅의 두 번째 제안을 시도 ... 등 ". 그리고 그것이 작동하는 것처럼 보였지만 파일을 검사했을 때 그들은 1 년 동안 올바른 래스터였습니다. 나는 NetCDF의 샘플을 1979 년부터 1981 년까지 사용했고 1980 년의 래스터 만 정확했습니다. – CallumRT

+0

Polyglot이 바빌론으로 연결됩니다. 죄송합니다. say 인수 2011을 사용하여 prpgram을 호출 할 때 목록 인 sys.argv 인 경우이 목록에는 위치 0의 프로그램 이름과 위치 1의 문자열 인 2011이라는 두 항목이 있습니다. 그래서 sys.argv [1]은 '2011'이 될 것입니다. – Dilettant

+1

NetCDF의 샘플에서 1979 년부터 1981 년까지이 작업을 수행했습니다. 매년 .csv 파일에 두 개의 날짜가 있고 1980 년의 래스터 만 정확했습니다. 후속 분석을 최대한 빨리 수행해야했기 때문에 모든 요일을 개별적으로 단일 폴더로 추출하고 "arcpy.CopyRaster_management"를 사용하여 이름을 기반으로 한 폴더에서 다른 폴더로 필요한 래스터/요일을 복사하여 해결 방법을 발견했습니다 " 다른 사람에게 도움이된다면, 계속 제안 된 제안을 시도해 보도록하겠습니다. 그렇지 않은 경우, 시작하기 위해 모든 NetCDF를 읽어야하는 방법을 발견했습니다. – CallumRT

관련 문제