Commit 5c6bb43c authored by Renzo Marini's avatar Renzo Marini
Browse files

cambio en nombre de los archivos .grib

parent ac6ed6a7
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from ecmwfapi import ECMWFDataServer
import constants
import sys
import datetime
def download(parameters):
server = ECMWFDataServer()
server.retrieve(parameters)
def print_help():
print("[Esto explicaría las distintas opciones para correr el script]")
sys.exit()
def handle_error(reason, parameter = None, levtype = None):
def handle_error(reason, parameter=None, levtype=None):
print("\nERROR: " + reason + "\n")
if parameter is not None:
if levtype is not None:
......@@ -29,28 +32,34 @@ def handle_error(reason, parameter = None, levtype = None):
for number in constants.o_map:
print(str(number) + " -> " + constants.o_map[number][0])
elif parameter == "type":
print("Los valores posibles son " + ", ".join([str(x) for x in getattr(constants, parameter)][:-1]) + " y " + str(getattr(constants, parameter)[-1]))
print("Los valores posibles son " + ", ".join(
[str(x) for x in getattr(constants, parameter)][:-1]) + " y " + str(getattr(constants, parameter)[-1]))
for abbr in constants.type_map:
print(str(abbr) + " -> " + constants.type_map[abbr])
elif parameter == "levtype":
print("Los valores posibles son " + ", ".join([str(x) for x in getattr(constants, parameter)][:-1]) + " y " + str(getattr(constants, parameter)[-1]))
print("Los valores posibles son " + ", ".join(
[str(x) for x in getattr(constants, parameter)][:-1]) + " y " + str(getattr(constants, parameter)[-1]))
for abbr in constants.lt_map:
print(str(abbr) + " -> " + constants.lt_map[abbr])
elif parameter == "number":
print("Los valores posibles son números del 1 al 50. Opcionalmente, puede utilizarse el valor 'all' como atajo para designar todos.")
print(
"Los valores posibles son números del 1 al 50. Opcionalmente, puede utilizarse el valor 'all' como atajo para designar todos.")
elif parameter == "origin_time":
print("Los valores que toma origin_time son listas con el formato [origin time time ...]. Por ejemplo: 1 00 06 12.")
print(
"Los valores que toma origin_time son listas con el formato [origin time time ...]. Por ejemplo: 1 00 06 12.")
print("Para origin, los identificadores están dados por las siguientes asociaciones:")
for number in constants.o_map:
print(str(number) + " -> " + constants.o_map[number][0])
print("Los valores posibles para time son 00, 06, 12 y 18")
else:
print("Los valores posibles son " + ", ".join([str(x) for x in getattr(constants, parameter)][:-1]) + " y " + str(getattr(constants, parameter)[-1]))
print("Los valores posibles son " + ", ".join(
[str(x) for x in getattr(constants, parameter)][:-1]) + " y " + str(getattr(constants, parameter)[-1]))
print("\n")
print("Para obtener ayuda, correr el script con la opción --help")
sys.exit()
if __name__ == "__main__":
# Parsear parámetros
......@@ -79,12 +88,12 @@ if __name__ == "__main__":
all_parameters = required_parameters + optional_parameters + conditional_parameters
for par in parameters:
if par not in all_parameters:
handle_error("El parámetro --" + par + " es inválido")
handle_error("El parámetro --" + par + " es inválido")
elif par in ["start_date", "end_date"]:
parameters[par][0] = parameters[par][0].replace("/", '-')
partition = parameters[par][0].split("-")
if len(partition) != 3 or len(partition[0]) != 4:
handle_error("El formato de " + par + " es AAAA-MM-DD")
handle_error("El formato de " + par + " es AAAA-MM-DD")
elif par in ["step", "type", "levtype"]:
for curr_par in parameters[par]:
if curr_par not in [str(x) for x in getattr(constants, par)]:
......@@ -94,15 +103,16 @@ if __name__ == "__main__":
if curr_origin_time[0] in constants.origin:
for time in curr_origin_time[1:]:
if time not in constants.time:
handle_error("El valor ingresado para el parámetro " + par + " es inválido.", par)
handle_error("El valor ingresado para el parámetro " + par + " es inválido.", par)
else:
handle_error("El valor ingresado para el parámetro " + par + " es inválido.", par)
elif par == "param":
for curr_par in parameters["param"]:
# if curr_par not in [str(id) for levtype_variables in constants.ids.values() for id in levtype_variables.values()]:
# if curr_par not in [str(id) for levtype_variables in constants.ids.values() for id in levtype_variables.values()]:
if curr_par not in [id for id in constants.ids[parameters["levtype"][0]].values()]:
handle_error(curr_par + " no es un parámetro posible en type of level " + parameters["levtype"][0], par, parameters["levtype"][0])
handle_error(curr_par + " no es un parámetro posible en type of level " + parameters["levtype"][0],
par, parameters["levtype"][0])
# Chequear que todos los parámetros requiridos fueron recibidos
for par in required_parameters:
if par not in parameters:
......@@ -114,19 +124,22 @@ if __name__ == "__main__":
handle_error("El parametro " + par + " es obligatorio.", par)
elif len(parameters[par]) == 0:
handle_error("No se proporcionó ningún valor para " + par)
# Validar levelist en los casos en que type of level es distinto de Surface
if parameters["levtype"][0] != "sfc":
if "levelist" not in parameters:
handle_error("Es necesario indicar parámetro levelist cuando levtype es " + parameters["levtype"][0], "levelist", parameters["levtype"][0])
handle_error("Es necesario indicar parámetro levelist cuando levtype es " + parameters["levtype"][0],
"levelist", parameters["levtype"][0])
for level in parameters["levelist"]:
if level not in constants.levelist[parameters["levtype"][0]]:
handle_error("Es valor " + level + " no es válido para el parámetro levelist, dado levtype = " + parameters["levtype"][0], "levelist", parameters["levtype"][0])
handle_error("Es valor " + level + " no es válido para el parámetro levelist, dado levtype = " +
parameters["levtype"][0], "levelist", parameters["levtype"][0])
# Parsear y validar el parametro number en el caso perturbed forecast
if parameters["type"][0] == "pf":
if "number" not in parameters:
handle_error("El parámetro number es obligatorio en el caso en que type es pf (Perturbed forecast).", "number")
handle_error("El parámetro number es obligatorio en el caso en que type es pf (Perturbed forecast).",
"number")
else:
if parameters["number"][0] == "all":
parameters["number"] = [str(x) for x in range(1, 51)]
......@@ -138,7 +151,7 @@ if __name__ == "__main__":
handle_error("El valor ingresado para el parámetro number es inválido", "number")
except ValueError:
handle_error("El valor ingresado para el parámetro number es inválido", "number")
# Se crea un request por cada conjunto de valores origin_time compatibles en el tiempo
# (No sé si es necesario, pero es lo que hace la interfaz web de TIGGE)
requests = {}
......@@ -151,7 +164,7 @@ if __name__ == "__main__":
if "origin" not in curr_path:
curr_path["origin"] = []
curr_path["origin"].append(curr_origin_time[0])
# Esqueleto del request
api_parameters = {
"class": "ti",
......@@ -159,9 +172,9 @@ if __name__ == "__main__":
"expect": "any",
"expver": "prod",
"grid": "1.0/1.0",
"area":"-28/300/-36/309"
"area": "-28/300/-36/309"
}
# Cargar parte de los parámetros del request
api_parameters["date"] = parameters["start_date"][0] + "/to/" + parameters["end_date"][0]
api_parameters["levtype"] = parameters["levtype"][0]
......@@ -176,7 +189,7 @@ if __name__ == "__main__":
for par in insertion_set:
value = "/".join(parameters[par])
api_parameters[par] = value
remaining_requests = [requests]
remaining_times = [""]
while len(remaining_requests) > 0:
......@@ -195,7 +208,13 @@ if __name__ == "__main__":
# Terminar de cargar los parámetros del request
api_parameters["origin"] = origin[1:]
api_parameters["time"] = curr_time[1:]
api_parameters["target"] = origin_target[1:] + "_" + api_parameters["type"] + "_" + api_parameters["date"].replace("/", "-") + ".grib"
if api_parameters["type"] == "pf" and len(api_parameters["number"]) == 1:
api_parameters["target"] = origin_target[1:] + "_pf_ens_" + api_parameters["number"][0] + "_" + \
api_parameters[
"date"].replace("/", "-") + ".grib"
else:
api_parameters["target"] = origin_target[1:] + "_" + api_parameters["type"] + "_" + api_parameters[
"date"].replace("/", "-") + ".grib"
# Hacer request
print(api_parameters)
download(api_parameters)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment