• Artículos
  • Documentos
    • Libro de Energía Solar Fotovoltaica
  • Omnia sunt Communia!

Omnia sunt Communia!

~ Sobre software, documentación y ciencia libres

Omnia sunt Communia!

Archivos de etiqueta: radiación solar

Los datos de AEMET o cómo hacer web scraping con R

31 Miércoles Oct 2012

Posted by Oscar Perpiñán Lamigueiro in Datos, R-castellano

≈ 8 comentarios

Etiquetas

AEMET, HTML, open data, R, radiación solar, XML

Hace unos días AEMET cerró el acceso público a sus servidores FTP. Esta decisión contrasta con las estrategias de open data defendidas desde la Comisión Europea, o con las posiciones adoptadas por otros organismos (por ejemplo, CM-SAF o NREL-MIDC).

ACTUALIZACIÓN: La web tiempodiario ha cambiado su estructura. El código que explico ya no es de utilidad para esta web. Para descargar los datos hay que seguir el formato que indica el webmaster de la página en uno de los comentarios de este artículo.

Afortunadamente, los datos publicados por AEMET hasta el 28 de Octubre de este año han sido recopilados en la página web tiempodiario.com. Con mis limitados conocimientos de HTML y la inestimable ayuda del paquete XML, he aprendido a acceder a la información de radiación solar de manera automática con R. Expongo a continuación lo que he conseguido. Debo avisar de que no siempre funciona bien el acceso a las páginas, y es posible que se produzca un error en el bucle. Una posible solución es reiniciar el bucle a partir del enlace problemático, o añadir controles de error con try:

library(XML)
library(zoo)

mainURL <- 'http://www.tiempodiario.com'
radURL <- 'http://www.tiempodiario.com/radiacion/'

## Días disponibles en tiempodiario.com
days <- seq(as.POSIXct('2010-12-05'), as.POSIXct('2012-10-28'), by='day')


for (i in seq_along(days)){
  day <- days[i]
  dayURL <- paste(radURL, format(day, '%Y/%m/%d'), '/', sep='')

  ## Obtengo el contenido HTML de la página del día en cuestión
  content <- htmlParse(dayURL, encoding='utf8')
  ## y extraigo los enlaces a cada estación para ese día
  links <- xpathSApply(content, "//a/@href")
  linksData <- links[grep('radiacion-estacion', links)]
  ## Los nombres de las estaciones están escritos en los encabezados H2
  h2 <- xpathSApply(content, "//h2")
  namesStations <- sapply(h2[-1], function(s){
    val <- xmlValue(s)
    substr(val, 10, nchar(val))
  })
  ## pero sus códigos de identificación están en los enlaces correspondientes
  idStation <- strsplit(linksData, '/')
  idStations <- sapply(idStation, function(x)x[4])

  dayStationURL <- paste(mainURL, linksData, sep='')

  ## Accedo a la página de cada estación para ese día
  zList <- lapply(dayStationURL, function(ds){
    print(ds)
    ## Obtengo el contenido HTML de la página
    content <- htmlParse(ds, encoding='utf8')
    ## y extraigo las tablas
    tabs <- readHTMLTable(content, header=TRUE)
    ## Cada tabla codifica el índice temporal en la primera
    ## columna. A pesar de usar header=TRUE, la primera fila
    ## contiene el nombre las columnas. De ahí que tenga que usar
    ## -1 en el indexado.
    time <- tabs[[1]][-1,1]
    dayTime <- format(as.POSIXct(paste(day, time)), '%Y-%m-%d %H:%M')
    ## El nombre de la variable de cada tabla está codificado en
    ## los encabezados H2
    h2 <- getNodeSet(content, '//h2')
    tabLabels <- sapply(h2, xmlValue)
    ## Sólo me quedaré con las radiación difusa, directa y global
    radVars <- c('Radiación Difusa (DF)',
                 'Radiación Directa (DT)',
                 'Radiación Global (GL)')
    whichTabs <- which(tabLabels %in% radVars)
    ## Extraigo la información de las tablas seleccionadas. Dado
    ## que la primera fila contiene los nombres de las columnas,
    ## todo el contenido es leído como un "factor". De ahí que
    ## tenga que usar la conversión as.character y después
    ## as.numeric.
    dat <- sapply(tabs[whichTabs],
                  function(tab)as.numeric(as.character(tab[-1, 2])))
    ## Finalmente, si todo ha ido bien, construyo un objeto zoo
    ## para almacenar la serie temporal de esta estación para este
    ## día. Si algo no ha funcionado obtendré NULL.
    if (length(dat) > 0 & !is.list(dat)) {
      z <- zoo(dat, as.POSIXct(dayTime))
      names(z) <- tabLabels[whichTabs]
      } else {
        z <- NULL
        }
    z
  })
  ## El resultado de lapply será una lista de objetos zoo, uno
  ## para cada estación. Pongo los nombres de las estaciones a
  ## cada componente de esta lista y grabo el resultado como un
  ## fichero RData.
  names(zList) <- make.names(namesStations)
  save(zList, file=paste(day, 'RData', sep='.'))
  ## Este código se repetirá para cada día, de forma que obtendré
  ## un conjunto de ficheros RData, uno por día. Cada uno de ellos
  ## contiene una lista de zoo's, correspondiendo cada componente
  ## de la lista a una estación de medida.
}

Una vez ejecutado el código anterior obtendremos una colección de ficheros diarios. Si nos interesa tener el registro completo de una estación determinada, es posible obtenerlo recorriendo todos los ficheros:

## Ficheros que he obtenido del bucle anterior.
files <- dir(pattern='RData')

## Por ejemplo, para obtener el registro de la estación de
## Valladolid, recorro todos los ficheros con lapply, y extraigo
## de cada uno el componente que me interesa.
valladolid <- lapply(files, FUN=function(f){
                     load(f)
                     dat <- zList$Valladolid
                     })
## El resultado de lapply será una lista de objetos zoo, que puedo
## transformar en un único objeto zoo con do.call
valladolid <- do.call(rbind, valladolid)

Con otro bucle adicional se puede automatizar el paso anterior y obtener toda la colección de estaciones:

stations <- names(zList)

lapply(stations, FUN=function(name){
  datStation <- lapply(files, FUN=function(f){
    load(f)
    dat <- zList[[name]]
  })
  datStation <- do.call(rbind, datStation)
  write.zoo(datStation, sep=';', file=paste(name, '.txt', sep=''))
})
Anuncios

Comparte / Share

  • Correo electrónico
  • Imprimir
  • Twitter
  • Facebook
  • LinkedIn
  • Pinterest
  • Google
  • Más
  • Tumblr
  • Reddit

Me gusta:

Me gusta Cargando...

The visual display of quantitative information

11 Domingo Abr 2010

Posted by Oscar Perpiñán Lamigueiro in Energía Solar Fotovoltaica, Palabras de otros, R-castellano, R-project, Software

≈ Comentarios desactivados en The visual display of quantitative information

Etiquetas

horizon graph, información, lattice, R-project, radiación solar, small multiples, solar, trellis, tufte

The visual display of quantitative information es el título de un libro clásico escrito por Edward Tufte. Así empieza su primer capítulo:

La excelencia en los gráficos estadísticos consiste en comunicar ideas complejas con claridad, precisión y eficiencia. Los gráficos debieran: mostrar la información; inducir al observador a pensar en la sustancia más que en la metodología, el diseño gráfico, la tecnología empleada para producir el gráfico o en cualquier otra cosa; evitar distorsionar lo que los datos tienen que decir; mostrar muchos números en un pequeño espacio; dar coherencia a grandes conjuntos de información; animar al ojo a comparar diferentes partes de la información; mostrar la información con varios niveles de detalle, desde una visión global hasta la estructura interna; servir a un propósito razonablemente claro, sea este la descripción, exploración, tabulación o decoración; estar integrado con las descripciones estadísticas y textuales de un conjunto de información.

Entre las muchas joyas que guarda este libro comentaré lo que Tufte llama “small multiples“:

Sigue leyendo →

Comparte / Share

  • Correo electrónico
  • Imprimir
  • Twitter
  • Facebook
  • LinkedIn
  • Pinterest
  • Google
  • Más
  • Tumblr
  • Reddit

Me gusta:

Me gusta Cargando...

Nueva versión del libro “Energía Solar Fotovoltaica”

06 Martes Abr 2010

Posted by Oscar Perpiñán Lamigueiro in Energía Solar Fotovoltaica, LyX/LaTeX

≈ 1 comentario

Etiquetas

creative commons, fotovoltaica, latex, libro, lyx, memoir, radiación solar

He realizado cambios, mejoras y correcciones en el libro “Energía Solar Fotovoltaica”. La nueva versión ya está disponible en este enlace: Libro de Energía Solar Fotovoltaica.

Añadido 23-04-2010: he incluido dentro del capítulo de Geometría Solar una subsección dedicada a la relación entre el tiempo oficial y el tiempo solar real.

Comparte / Share

  • Correo electrónico
  • Imprimir
  • Twitter
  • Facebook
  • LinkedIn
  • Pinterest
  • Google
  • Más
  • Tumblr
  • Reddit

Me gusta:

Me gusta Cargando...

Omnia sunt communia!

“As we enjoy great advantages from the inventions of others, we should be glad of an opportunity to serve others by any invention of ours, and this we should do freely and generously”

RSS Feed RSS - Entradas

Introduce tu dirección de correo electrónico para seguir este Blog y recibir las notificaciones de las nuevas publicaciones en tu buzón de correo electrónico.

Únete a otros 92 seguidores

Posts Más Vistos

  • Maps with R (I)
  • Libro de Energía Solar Fotovoltaica
  • Son cosas chiquitas
  • Maps with R (II)
  • Manipulación de documentos PDF
View Oscar Perpiñán Lamigueiro's profile on LinkedIn
profile for Oscar Perpiñán on Stack Exchange, a network of free, community-driven Q&A sites
Citations for Oscar Perpinan

@oscarperpinan

Mis tuits

Enlaces

  • Displaying time series, spatial and space-time data with R
  • Introducción a R

Top Clicks

  • oscarperpinan.github.io/s…
  • github.com/oscarperpinan/…
  • github.com/oscarperpinan/…
  • oscarperpinan.github.com/…
  • procomun.files.wordpress.…
  • dl.dropbox.com/u/40293713…
  • ine.es/jaxi/menu.do?type=…
  • dl.dropbox.com/u/40293713…
  • ine.es/ss/Satellite?c=Pag…
  • ine.es

Etiquetas

actuar anarquía autocontención ayuda mutua bloch ciencia circuitos eléctricos común cooperación CRAN creative commons data data.table data analysis ecología emacs Energía energía solar fotovoltaica entropía EOI esperanza exergía forecast fotovoltaica galeano github GNU General Public License información investigación jorge riechmann kropotkin latex lattice lewis mumford libro lyx map maps memoir meteorological data movimientos sociales nestoria nicolas georgescu roegen NWP open data openstreetmap orgmode pensar photovoltaics pobreza R R-project radiación solar raster rasterVis reproducible research siar small multiples software libre solar solar radiation sp spatial spatial data spplot tecnología time series trellis tufte uned utopía Vector field visualización visualization WRF

RSS R-bloggers

  • Post to Mastodon from R
  • Anatomy of a logistic growth curve
  • The Most Amount of Rain over a 10 Day Period on Record
  • Data-driven Introspection of my Android Mobile usage in R

RSS dataanalytics

  • Modas y fotogenia del código secuencial
  • Gráfico con eje secundario en ggplot2
  • Una cosa buena, una cosa mala
  • Sr. Python, muchas gracias por su candidatura; ya le llamaremos cuando… tenga modelos mixtos

RSS Solar Energy (Elsevier)

  • Se ha producido un error; es probable que la fuente esté fuera de servicio. Vuelve a intentarlo más tarde.

RSS Progress in Photovoltaics

  • Se ha producido un error; es probable que la fuente esté fuera de servicio. Vuelve a intentarlo más tarde.

RSS Madridmasd

  • LA RESPONSABILIDAD y LA ETICA: TRES INDENTICOS DESCONOCIDOS
  • La transición ecológica y la sexta extinción
  • El laboratorio 5TONIC muestra el progreso de un proyecto europeo 5G
  • Aprender a programar. Esto es lo que deben –y quieren- saber los estudiantes de periodismo
  • De la Filosofía de la Ciencia a la Filosofía de la Tecnociencia (Nuevo Curso Básico y Sus Razones)
Anuncios
Licencia Creative Commons
Salvo indicación en contra todos los contenidos están publicados por Oscar Perpiñán Lamigueiro bajo una Licencia Creative Commons Reconocimiento-No Comercial-Compartir Igual 3.0 Unported.

Crea un blog o un sitio web gratuitos con WordPress.com.

loading Cancelar
La entrada no fue enviada. ¡Comprueba tus direcciones de correo electrónico!
Error en la comprobación de email. Por favor, vuelve a intentarlo
Lo sentimos, tu blog no puede compartir entradas por correo electrónico.
Privacidad & Cookies: este sitio usa cookies. Al continuar usando este sitio, estás de acuerdo con su uso. Para saber más, incluyendo como controlar las cookies, mira aquí: Política de Cookies.
A %d blogueros les gusta esto: