0

在这里http://www.bom.gov.au/climate/data/我可以输入一个变电站号码,比如 009572;选择变量(比如温度)及其类型(比如最大值)。单击“获取数据”会将我带到带有“所有年份数据”链接的页面。单击它,您将获得一个 zip 文件。我知道这个问题,但在这里我没有指向 zip 文件的直接链接。可以用 R 从澳大利亚气象局网站自动提取天气数据吗?

4

4 回答 4

4

我有同样的问题,这个 SO question 是出现的第一页之一。经过进一步搜索,我发现了 R 包 Bomrang ( https://github.com/ropensci/bomrang ):

提供与澳大利亚政府气象局 (BOM) 数据交互的功能,获取数据并返回包含精确预报、当前气象站气象数据、农业信息公告、历史气象数据以及下载和导入雷达或卫星图像的整洁数据框。

Bomrang 是 rOpenSci 的一部分,并且正在积极开发中。它有一组很好的功能:

bomrang 提供了几个功能来检索澳大利亚气象局 (BOM) 数据。一系列函数检索天气数据并返回整洁的数据帧;

get_precis_forecast(), which retrieves the précis (short) forecast;
get_current_weather(), which fetches the current weather for a given station;
get_ag_bulletin(), which retrieves the agriculture bulletin;
get_weather_bulletin(), which retrieves the BOM 0900 or 1500 bulletins;
get_coastal_forecast(), which returns coastal waters forecasts; and
get_historical(), which retrieves historical daily observations for a given station.

第二组功能检索与卫星和雷达图像有关的信息,

get_available_imagery();
the satellite imagery itself, get_satellite_imagery();
get_available_radar(); and
the radar imagery itself, get_radar_imagery().

该功能get_historical()似乎可以满足 OP 的需求。例如,要从悉尼的气象站获取历史每日降雨量,只需:

> rain_066062 <- bomrang::get_historical(stationid = 066062,
+                         type = 'rain',
+                         meta = T)
> head(rain_066062)
$`meta`
# A tibble: 1 x 10
   site name                        lat   lon start      end        years percent AWS   ncc_obs_code
  <int> <chr>                     <dbl> <dbl> <date>     <date>     <dbl>   <int> <chr> <chr>       
1 66062 SYDNEY (OBSERVATORY HILL) -33.9  151. 1858-07-01 2018-11-01  160.     100 Y     136         

$historical_data
      Product_code Station_number Year Month Day Rainfall Period Quality
1       IDCJAC0009          66062 1858     1   1       NA     NA        
2       IDCJAC0009          66062 1858     1   2       NA     NA        
3       IDCJAC0009          66062 1858     1   3       NA     NA        
4       IDCJAC0009          66062 1858     1   4       NA     NA        
5       IDCJAC0009          66062 1858     1   5       NA     NA      
<<SNIP>>

另一个不错的功能是,如果您有感兴趣的地方的经度和纬度,get_historical() 将找到离该位置最近的气象站。

从 CRAN 安装:

install.packages("bomrang")

或者从 Github 安装开发版本:

if (!require("remotes")) {
  install.packages("remotes", repos = "http://cran.rstudio.com/")
  library("remotes")
}

install_github("ropensci/bomrang", build_vignettes = TRUE)
于 2018-11-27T05:42:50.077 回答
3

这是我为立即下载所做的代码,它也解决了您的 p_c 问题。如果您愿意并发布,您可以改进该功能。

#daily code = 136
#monthy code = 139

bomdata<- function(station,code){
for(i in 1: length(station)){
p.url<-paste("http://www.bom.gov.au/jsp/ncc/cdio/weatherData/av?p_stn_num=",station[i],"&p_display_type=availableYears&p_nccObsCode=",code,sep ="")
download.file(p.url,"test.txt")
filelist <- list.files(pattern = ".txt")
foo<- file(filelist,"r")
text<- suppressWarnings(readLines(foo))
close(foo)
l<- regexpr(":",text[1])
m<- unlist(gregexpr(",", text[1], perl = TRUE))
pc<- substr(text[1],l[[1]]+1,l[[1]]+(m[2]-(l[[1]]+1)))
url<-paste("http://www.bom.gov.au/jsp/ncc/cdio/weatherData/av?p_display_type=dailyZippedDataFile&p_stn_num=",station[i],"&p_c=",pc,"&p_nccObsCode=",code,"&p_startYear=2013", sep ="")
suppressWarnings(download.file(url,paste(station[i],".zip",sep= ""), mode = "wb"))
unlink("test.txt")
 }
}

例子

bomdata(073137,136)
于 2013-12-23T05:52:10.620 回答
1

你可以试试这个,它是metvurst包使用的代码序列。梅特沃斯特

## SET URL FOR DATA DOWNLOAD
url <- "http://www.bom.gov.au/ntc/IDO70004/IDO70004_"

## YEARS TO BE DOWNLOADED
yr <- 1993:2012

## READ DATA FOR ALL YEARS FROM URL INTO LIST
fijilst <- lapply(seq(yr), function(i) {
read.csv(paste(url, yr[i], ".csv", sep = ""), na.strings = c(-9999, 999))
})
于 2013-12-05T10:34:44.073 回答
0

虽然我仍然看不到如何使用 download.file() 执行此操作,但以下几乎可以完成工作,前提是 Chrome 的“下载前询问每个文件的保存位置”未选中。

system(paste('"C:/Documents and Settings/UserName/Local Settings/Application Data/Google/Chrome/Application/chrome.exe"',
         '-url http://www.bom.gov.au/jsp/ncc/cdio/weatherData/av?p_display_type=dailyZippedDataFile&p_stn_num=009572&p_c=-18465084&p_nccObsCode=136'), wait = FALSE)

然后,如果我知道 p_c=-18465084 的含义以及它如何从一个站到另一个站,我可以使用 paste0() 并循环遍历各个站号。

于 2013-10-10T15:18:24.167 回答