2017-09-12 7 views
0

J'ai besoin des données météorologiques historiques (température) sur une base horaire pour Chicago, IL (code postal 60603)Comment obtenir des données météorologiques historiques (température) sur une base horaire pour Chicago, IL

Fondamentalement je en ai besoin pour le mois de Juin et Juillet 2017 soit toutes les heures ou dans un intervalle de 15 minutes.

J'ai cherché sur NOAA, Météo souterrain etc. Mais n'ai pas trouvé quelque chose de pertinent à mon cas d'utilisation. Essayé mes mains sur grattage en utilisant R et Python, mais pas de chance.

Voici un extrait pour la même

R:

library(httr) 
library(XML) 
url <- "http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php" 
response <- GET(url,query=list(zipCodeList="10001", 
          product="time-series", 
          begin=format(Sys.Date(),"%Y-%m-%d"), 
          Unit="e", 
          temp="temp",rh="rh",wspd="wspd")) 
doc <- content(response,type="text/xml", encoding = "UTF-8") # XML document with the data 
# extract the date-times 
dates <- doc["//time-layout/start-valid-time"] 
dates <- as.POSIXct(xmlSApply(dates,xmlValue),format="%Y-%m-%dT%H:%M:%S") 
# extract the actual data 
data <- doc["//parameters/*"] 
data <- sapply(data,function(d)removeChildren(d,kids=list("name"))) 
result <- do.call(data.frame,lapply(data,function(d)xmlSApply(d,xmlValue))) 
colnames(result) <- sapply(data,xmlName) 
# combine into a data frame 
result <- data.frame(dates,result) 
head(result) 

Erreur:

Error in UseMethod("xmlSApply") : 
no applicable method for 'xmlSApply' applied to an object of class "list" 

Python:

from pydap.client import open_url 

# setup the connection 
url = 'http://nomads.ncdc.noaa.gov/dods/NCEP_NARR_DAILY/197901/197901/narr- 
a_221_197901dd_hh00_000' 
modelconn = open_url(url) 
tmp2m = modelconn['tmp2m'] 

# grab the data 
lat_index = 200 # you could tie this to tmp2m.lat[:] 
lon_index = 200 # you could tie this to tmp2m.lon[:] 
print(tmp2m.array[:,lat_index,lon_index]) 

Erreur:

HTTPError: 503 Service Temporarily Unavailable 

Toute autre solution est appréciée soit en R ou Python ou tout lien ensemble de données en ligne sur le

+0

En premier lieu, demander des tutoriels/outils logiciels, etc. est hors-sujet sur StackOverflow. Cependant, vous essayez de faire une tentative, mais n'expliquez pas ce qui ne fonctionne pas, votre source d'entrée ou la sortie désirée. Et s'il vous plaît envoyer un échantillon de XML téléchargé pour éviter nous généreux, les bénévoles à temps limité de l'exécution des demandes réelles. – Parfait

Répondre

2

Il y a un paquet R rwunderground, mais je ne l'ai pas eu beaucoup de succès à obtenir ce que je veux en sortir. En toute honnêteté, je ne suis pas sûr si c'est le paquet, ou si c'est moi. Finalement, je suis tombé en panne et j'ai écrit un rapide diddy pour obtenir l'historique météorologique quotidien des stations météorologiques personnelles. Vous devrez vous inscrire à un jeton d'API Weather Underground (je vous le laisserai). Ensuite, vous pouvez utiliser les éléments suivants:

library(rjson) 

api_key <- "your_key_here" 
date <- seq(as.Date("2017-06-01"), as.Date("2017-07-31"), by = 1) 
pws <- "KILCHICA403" 

Weather <- vector("list", length = length(date)) 

for(i in seq_along(Weather)){ 
    url <- paste0("http://api.wunderground.com/api/", api_key, 
       "/history_", format(date[i], format = "%Y%m%d"), "https://stackoverflow.com/q/pws:", 
       pws, ".json") 
    result <- rjson::fromJSON(paste0(readLines(url), collapse = " ")) 
    Weather[[i]] <- do.call("rbind", lapply(result[[2]][[3]], as.data.frame, 
              stringsAsFactors = FALSE)) 
    Sys.sleep(6) 
} 

Weather <- do.call("rbind", Weather) 

Il y a un appel à Sys.sleep, ce qui provoque la boucle d'attendre 6 secondes avant de passer à l'itération suivante. Ceci est fait parce que l'API gratuite ne permet que dix appels par minute (jusqu'à 500 par jour).

De même, certains jours peuvent ne pas avoir de données. Rappelez-vous que cela se connecte à une station météo personnelle. Il pourrait y avoir un certain nombre de raisons pour lesquelles il a cessé de télécharger des données, y compris des pannes d'Internet, des pannes d'électricité, ou le propriétaire a désactivé le lien vers Weather Underground. Si vous ne parvenez pas à extraire les données d'une station, essayez-en une autre et remplissez les espaces.

Pour obtenir un code de station météo, rendez-vous sur weatherunderground.com. Entrez votre code postal désiré dans la barre de recherche

enter image description here

Cliquez sur le lien « Modifier »

enter image description here

Vous pouvez voir le code de la station de la station actuelle et des options pour d'autres stations proche.

enter image description here

+0

Merci beaucoup, ça a marché. Mais peu de requêtes, comme je suis nouveau à ce sujet. 1.Ce code fonctionne pour chaque jour? Puisque j'ai besoin pour chaque jour pendant une période de 2 mois (Juin et Juillet) comment je vais y aller? 2. Il y a beaucoup de paramètres, mais j'ai besoin de la température pour cette heure/jour, donc quel paramètre devrais-je me référer? Est-ce le tempi? – Anagha

+0

Et il ne faut pas prendre du 1er au 3 juin, quel paramètre considérer tempm ou tempi? – Anagha

+0

'tempm' donne la température en degrés Celsius. 'tempi' donne la température en Fahrenheit. ('m' = métrique,' i' = impérial). Voir le code édité pour une boucle pour collecter plusieurs jours. – Benjamin

1

Juste pour fournir une solution de python pour celui qui vient par cette question à la recherche d'un. Ce sera (par la poste) passer chaque jour en Juin et Juillet 2017 obtenir toutes les observations pour un emplacement donné. Cela ne se limite pas à 15 minutes ou toutes les heures mais fournit toutes les données observées le jour. Une analyse supplémentaire du temps d'observation par observation est nécessaire mais c'est un début.

WunderWeather

pip install WunderWeather pip install arrow

import arrow # learn more: https://python.org/pypi/arrow 
from WunderWeather import weather # learn more: https://python.org/pypi/WunderWeather 

api_key = '' 
extractor = weather.Extract(api_key) 
zip = '02481' 

begin_date = arrow.get("201706","YYYYMM") 
end_date = arrow.get("201708","YYYYMM").shift(days=-1) 
for date in arrow.Arrow.range('day',begin_date,end_date): 
    # get date object for feature 
    # http://wunderweather.readthedocs.io/en/latest/WunderWeather.html#WunderWeather.weather.Extract.date 
    date_weather = extractor.date(zip,date.format('YYYYMMDD')) 

    # use shortcut to get observations and data 
    # http://wunderweather.readthedocs.io/en/latest/WunderWeather.html#WunderWeather.date.Observation 
    for observation in date_weather.observations: 
    print("Date:",observation.date_pretty) 
    print("Temp:",observation.temp_f)