如何获取伊利诺伊州芝加哥每小时的历史天气数据(温度)
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 分钟或每小时,但确实提供了当天观察到的所有数据。每次观察需要额外解析观察时间,但这是一个开始。
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)
我需要伊利诺伊州芝加哥(邮政编码 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 分钟或每小时,但确实提供了当天观察到的所有数据。每次观察需要额外解析观察时间,但这是一个开始。
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)