rweatherrnoaa

rnoaa showing data is available, but not returning request


I'm working with the rnoaa() package to get some historical weather data and am running into problems with retrieving data that says is available, but will not return.

In order for this reproducible example to work you will first need a token from http://www.ncdc.noaa.gov/cdo-web/token

Setup:

options(noaakey = "KEY_EMAILED_TO_YOU")
library(rnoaa)

Check what type of data is available:

ncdc_datatypes(stationid = "GHCND:US009052008", datasetid='GHCND')

Output:

$meta
  offset count limit
1      1     4    25

$data
Source: local data frame [4 x 5]

     mindate    maxdate                                      name datacoverage    id
       (chr)      (chr)                                     (chr)        (int) (chr)
1 1781-01-01 2015-10-30              Precipitation (tenths of mm)            1  PRCP
2 1857-01-18 2015-10-29                           Snow depth (mm)            1  SNWD
3 1763-01-01 2015-10-30 Maximum temperature (tenths of degrees C)            1  TMAX
4 1763-01-01 2015-10-30 Minimum temperature (tenths of degrees C)            1  TMIN

attr(,"class")
[1] "ncdc_datatypes"
ncdc(stationid = "GHCND:US009052008", datasetid='GHCND', datatypeid = 'PRCP', startdate = "1900-01-01", enddate = "1900-12-30")

Notice that the minimum data available for PRCP is 1781. So Let me try and pull data from just the year 1900 as it should be available.

Try and pull data from 1900:

ncdc(stationid = "GHCND:US009052008", datasetid='GHCND', datatypeid = 'PRCP', startdate = "1900-01-01", enddate = "1900-12-30")

Output:

$meta
$meta$totalCount
NULL

$meta$pageCount
NULL

$meta$offset
NULL


$data
Source: local data frame [0 x 0]


attr(,"class")
[1] "ncdc_data"
Warning message:
In check_response(temp) : Sorry, no data found

Solution

  • One way:

    sta <- "US009052008"
    input <- paste0("ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/all/",sta,".dly")
    
    output <- read.fwf(input, n = -1,
                       widths = c(11,4,2,4), 
                       col.names = c("ID", "YEAR", "MONTH", "ELEMENT"))
    
    out <- split(output, output$ELEMENT)
    
    foo <- function(x){
      y1 <- head(x[,c("YEAR", "MONTH")], 1)
      y2 <- tail(x[,c("YEAR", "MONTH")], 1)
    
      paste(month.abb[y1$MONTH], y1$YEAR, "-", month.abb[y2$MONTH], y2$YEAR)
    }
    do.call(rbind, lapply(out, foo))
    #       [,1]                 
    # PRCP "Oct 2008 - Oct 2015"
    # SNWD "Dec 2009 - Oct 2015"
    # TMAX "Oct 2008 - Oct 2015"
    # TMIN "Oct 2008 - Oct 2015"