如何使用 R 和 DARKSKY api 创建一个函数来检索多个城市的历史天气?
How to create a function to retrieve multiple cities historical weather using R and DARKSKY api?
我正在尝试使用 DARKSKY API 在 R 中检索 100 个城市的历史天气数据。
以下代码可用于获取 1 个城市的历史数据,但是我在创建循环函数以遍历 100 个纬度和经度的列表并吐出数据时遇到问题。
weather <- function(Long,Lat)
{ a <-seq(Sys.Date()-10, Sys.Date(), "1 day") %>%
map(~get_forecast_for(Long,Lat,.x, units = 'si')) %>%
map_df('daily')
write.csv(a,"blah blah")
}
weather(52.6983,-1.0735)
我最初的想法是上传包含我需要的所有经度和纬度的 csv 文件。将它们设置为变量,然后将它们映射到上面的函数。
data <- read.csv("blah blah")
Long <- data$Longitude
Lat <- data$Latitude
map(c("Long","Lat"),weather)
但它不断返回错误信息。
有人可以帮忙吗?
谢谢
你快到了。按行迭代 get_forecast_for
函数需要做一些事情。在 purrr
包中,pmap
函数适用于按行重复函数,而 imap
函数可用于按行中的单元格重复函数。
使用这种方法,我写了两个函数:weather_at_coords
和 weather
。 weather_at_coords
用于向 DarkSkyAPI 发送请求以获取给定时间范围内(即最近十天)特定位置的天气。 weather
函数用于按行重复函数。
我看到您想要嵌套对象 daily
,因此编写了从响应中提取该列表的函数。我假设您也想要 data.frame 中的结果,所以我添加了 bind_rows
。我添加了一个列 id
以便可以将行正确链接到某个位置(或者您可以添加您喜欢的任何列)。
# pkgs
library(tidyverse)
library(darksky)
# set API Key: free from https://darksky.net/dev
darksky::darksky_api_key()
# Forecast at a given point and time period
weather_at_coords <- function(...) {
d <- rlang::list2(...)
time <- seq(Sys.Date()-10, Sys.Date(), "1 day")
response <- imap(time, ~ darksky::get_forecast_for(d$lat, d$lon, .x, units = "si")[["daily"]])
out <- bind_rows(response) %>% mutate(id = d$id)
return(out)
}
# primary function (iterates across rows)
weather <- function(data) {
result <- pmap(data, ~ weather_at_coords(...))
return(bind_rows(result))
}
# sample data
d <- data.frame(
id = c("a", "b"),
lat = c(37.8267,34.8267),
lon = c(-122.423, -120.423)
)
# run
x <- weather(d)
x
备注
- 确保安装了
rlang
软件包
- 根据需要调整
lat
和 lon
变量名称。
我正在尝试使用 DARKSKY API 在 R 中检索 100 个城市的历史天气数据。
以下代码可用于获取 1 个城市的历史数据,但是我在创建循环函数以遍历 100 个纬度和经度的列表并吐出数据时遇到问题。
weather <- function(Long,Lat)
{ a <-seq(Sys.Date()-10, Sys.Date(), "1 day") %>%
map(~get_forecast_for(Long,Lat,.x, units = 'si')) %>%
map_df('daily')
write.csv(a,"blah blah")
}
weather(52.6983,-1.0735)
我最初的想法是上传包含我需要的所有经度和纬度的 csv 文件。将它们设置为变量,然后将它们映射到上面的函数。
data <- read.csv("blah blah")
Long <- data$Longitude
Lat <- data$Latitude
map(c("Long","Lat"),weather)
但它不断返回错误信息。
有人可以帮忙吗?
谢谢
你快到了。按行迭代 get_forecast_for
函数需要做一些事情。在 purrr
包中,pmap
函数适用于按行重复函数,而 imap
函数可用于按行中的单元格重复函数。
使用这种方法,我写了两个函数:weather_at_coords
和 weather
。 weather_at_coords
用于向 DarkSkyAPI 发送请求以获取给定时间范围内(即最近十天)特定位置的天气。 weather
函数用于按行重复函数。
我看到您想要嵌套对象 daily
,因此编写了从响应中提取该列表的函数。我假设您也想要 data.frame 中的结果,所以我添加了 bind_rows
。我添加了一个列 id
以便可以将行正确链接到某个位置(或者您可以添加您喜欢的任何列)。
# pkgs
library(tidyverse)
library(darksky)
# set API Key: free from https://darksky.net/dev
darksky::darksky_api_key()
# Forecast at a given point and time period
weather_at_coords <- function(...) {
d <- rlang::list2(...)
time <- seq(Sys.Date()-10, Sys.Date(), "1 day")
response <- imap(time, ~ darksky::get_forecast_for(d$lat, d$lon, .x, units = "si")[["daily"]])
out <- bind_rows(response) %>% mutate(id = d$id)
return(out)
}
# primary function (iterates across rows)
weather <- function(data) {
result <- pmap(data, ~ weather_at_coords(...))
return(bind_rows(result))
}
# sample data
d <- data.frame(
id = c("a", "b"),
lat = c(37.8267,34.8267),
lon = c(-122.423, -120.423)
)
# run
x <- weather(d)
x
备注
- 确保安装了
rlang
软件包 - 根据需要调整
lat
和lon
变量名称。