如何获取伊利诺伊州芝加哥每小时的历史天气数据(温度)

How to get historical weather data (Temperature) on hourly basis for Chicago, IL

我需要伊利诺伊州芝加哥(邮政编码 60603)每小时的历史天气数据(温度)

基本上我需要在 2017 年 6 月和 2017 年 7 月每小时或每隔 15 分钟使用一次。

我搜索了 NOAA、Weather underground 等。但没有找到与我的用例相关的任何内容。尝试使用 R 和 Python 进行抓取,但没有成功。

这是相同的片段

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)

错误:

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] )

错误:

 HTTPError: 503 Service Temporarily Unavailable

R 或 Python 或任何相关在线数据集 link

中的任何其他解决方案都值得赞赏

有一个 R 包 rwunderground,但我并没有从中获得我想要的东西。老实说,我不确定那是包裹,还是我。

最终,我崩溃了,写了一个快速的 diddy 来获取个人气象站的每日天气历史。您需要注册一个 Weather Underground API 令牌(我会把它留给您)。然后您可以使用以下内容:

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"), "/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)

有一个对 Sys.sleep 的调用,这导致循环在进入下一次迭代之前等待 6 秒。这样做是因为免费 API 每分钟只允许十次通话(每天最多 500 次)。

另外,有些日子可能没有数据。请记住,这会连接到个人气象站。它停止上传数据的原因可能有很多,包括互联网中断、停电或所有者关闭了 link 到 Weather Underground。如果您无法从一个站点获取数据,请尝试附近的另一个站点并填补空白。

要获取气象站代码,请转至 weatherunderground.com。在搜索栏中输入您想要的邮政编码

点击"Change"link

您可以看到当前车站的车站代码,以及附近其他车站的选项。

只是为了提供一个 python 解决方案给任何来找这个问题的人。这将(根据 post)在 2017 年 6 月和 2017 年 7 月的每一天获取给定位置的所有观测值。这不限于 15 分钟或每小时,但确实提供了当天观察到的所有数据。每次观察需要额外解析观察时间,但这是一个开始。

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)