Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Renzo Marini Salsamendi
Rafagas
Commits
5c6bb43c
Commit
5c6bb43c
authored
Nov 26, 2019
by
Renzo Marini
Browse files
cambio en nombre de los archivos .grib
parent
ac6ed6a7
Changes
1
Hide whitespace changes
Inline
Side-by-side
script.py
View file @
5c6bb43c
#!/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
(
"
\n
ERROR: "
+
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
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment