2016-06-01 9 views
1

Ich habe mehrere NetCDF-Dateien (eine für jedes Jahr), die tägliche Niederschlagswerte für Australien enthalten.Extrahieren von Rastern aus mehreren NetCDF-Dateien basierend auf Datumswerten in Python

Momentan kann ich die gewünschten Tage extrahieren, indem ich aus einer .csv-Datei lese, die die Liste der gewünschten Daten enthält. Von diesem gibt es dann jeden Tag als Rasterdatei aus.

Das Skript, das ich im Moment habe, erlaubt mir jedoch nur ein Jahr nach dem anderen. Ich bin ziemlich neu in Python und anstatt das Skript viele Male neu zu starten, indem ich die NetCDF-Datei änderte, die es einliest (sowie die Liste der Daten in der .csv-Datei), hatte ich gehofft, etwas Hilfe bei der Erstellung eines Schleife, die die Liste der NetCDFs durchlesen wird.

Ich verstehe, dass Module wie NetCDF4 verfügbar sind, um alle Dateien als eine zu behandeln, aber trotz viele Stunden lesen, was andere getan haben, bin ich keiner der Klüger.

Hier ist, was ich bisher:

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" 

Die NetCDF Dateien von pre.1900.nc durch

Jede Hilfe pre.2011.nc benannt wäre sehr dankbar!

+0

Was ist das Format für 'dateValueIndex'? Und poste einige Werte. – Serenity

+0

Du würdest also, wie ich aus der aktuellen Prosa frage, entweder ein Argument behandeln und dieses als Variable anstelle des hartcodierten Literals 'pre.2011.nc' verwenden, um auf die passende netcdf-Datei zuzugreifen oder eine andere Loop-Ebene einzubetten (äußere) das geht irgendwie wie "für Jahr in Reichweite (1900, 2012)": und verdaut dann die Dateien. Offene Frage: Müssen die Parameterdateien auch übereinstimmen? SHall gebe ich eine Probe darauf basierend? – Dilettant

Antwort

1

Wenn die Frage ist wirklich über Python Kommandozeilenargumente könnten Sie so etwas wie hinzufügen:

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

und dann diese nc_name als filepathargument verwenden in Ihrem arcpy.MakeNetCDFRasterLayer_md Anruf

Die andere Möglichkeit wäre, wie vorgeschlagen im Kommentar zu hart Code eine andere Schicht wie folgt in Frage:

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

und dann rufen Sie arcpy.MakeNetCDFRasterLayer_md usw.

+0

Danke Dilettant ... Ich versuchte Ihren ersten Vorschlag, aber es kam mit einem Fehler, der sagt "AttributeError: 'Modul' Objekt hat kein Attribut 'args'" Ich versuchte dann Ihren zweiten Vorschlag setzen "für Jahr in Reichweite ... etc ". Und obwohl es schien zu funktionieren, als ich die Dateien überprüfte, waren sie nur die richtigen Raster für ein Jahr. Ich habe dies auf einer NetCDF-Probe von 1979 bis 1981 gemacht und nur die Raster von 1980 waren korrekt. – CallumRT

+0

Polyglot führt zu babylon - sorry ist sys.argv was eine Liste ist, wenn Sie Ihr prpgram mit say Argument 2011 aufrufen, dann hat diese Liste zwei Einträge: den Namen Ihres Programms in Position 0 und 2011 als String in Position 1. sys.argv [1] wäre also '2011' – Dilettant

+1

Ich habe dies auf einer NetCDF-Stichprobe von 1979 bis 1981 gemacht, mit zwei Daten für jedes Jahr in der .csv-Datei und nur die Raster von 1980 waren korrekt. Da ich meine nachfolgende Analyse so schnell wie möglich durchführen musste, fand ich eine Problemumgehung, indem ich alle Tage für alle Jahre getrennt in einen einzigen Ordner extrahierte und die erforderlichen Raster/Tage von einem Ordner in einen anderen Ordner mit dem Namen "arcpy.CopyRaster_management" kopierte " Wenn es für andere hilfreich ist, werde ich weiterhin alle Vorschläge versuchen. Wenn nicht, habe ich einen Weg gefunden, zuerst alle NetCDFs zu lesen. – CallumRT