diff --git a/R/importWaterML1.r b/R/importWaterML1.r index b0f9ccecf4753d1ba1a4132bfd53849ec2f73b0c..6d3769ad849100ee3680e1da34a840d1ac492c6f 100644 --- a/R/importWaterML1.r +++ b/R/importWaterML1.r @@ -4,6 +4,7 @@ #' NWIS site, parameter code, statistic, startdate and enddate. #' #' @param obs_url string containing the url for the retrieval +#' @param asDateTime logical, if TRUE returns date and time as POSIXct, if FALSE, Date #' @return mergedDF a data frame containing columns agency, site, dateTime, values, and remark codes for all requested combinations #' @export #' @import XML @@ -13,7 +14,6 @@ #' endDate <- "2012-10-01" #' offering <- '00003' #' property <- '00060' -#' urlBase <- "http://waterservices.usgs.gov/nwis" #' obs_url <- constructNWISURL(siteNumber,property,startDate,endDate,'dv') #' data <- importWaterML1(obs_url) #' urlMulti <- constructNWISURL("04085427",c("00060","00010"), @@ -26,9 +26,9 @@ #' startGW,endGW, service="gwlevels", format="xml") #' groundWater <- importWaterML1(groundwaterExampleURL) #' unitDataURL <- constructNWISURL(siteNumber,property, -#' "2014-10-10","2014-10-10",'uv',format='xml') -#' unitData <- importWaterML1(unitDataURL) -importWaterML1 <- function(obs_url){ +#' "2013-11-03","2013-11-03",'uv',format='xml') +#' unitData <- importWaterML1(unitDataURL,TRUE) +importWaterML1 <- function(obs_url,asDateTime=FALSE){ h <- basicHeaderGatherer() doc = tryCatch({ @@ -61,50 +61,43 @@ importWaterML1 <- function(obs_url){ chunk <- xmlRoot(chunk) chunkNS <- xmlNamespaceDefinitions(chunk, simplify = TRUE) -# site <- as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:siteProperty[@name='hucCd']", namespaces = chunkNS, xmlValue)) site <- as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:siteCode", namespaces = chunkNS, xmlValue)) agency <- as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:siteCode/@agencyCode", namespaces = chunkNS)) pCode <-as.character(xpathApply(chunk, "ns1:variable/ns1:variableCode", namespaces = chunkNS, xmlValue)) statCd <- as.character(xpathApply(chunk, "ns1:variable/ns1:options/ns1:option/@optionCode", namespaces = chunkNS)) valuesIndex <- as.numeric(which("values" == names(chunk))) - + + zoneAbbrievs <- c(as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:timeZoneInfo/ns1:defaultTimeZone/@zoneAbbreviation", namespaces = chunkNS)), as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:timeZoneInfo/ns1:daylightSavingsTimeZone/@zoneAbbreviation", namespaces = chunkNS))) - names(zoneAbbrievs) <- c(as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:timeZoneInfo/ns1:defaultTimeZone/@zoneOffset", namespaces = chunkNS)), - as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:timeZoneInfo/ns1:daylightSavingsTimeZone/@zoneOffset", namespaces = chunkNS))) + as.character(xpathApply(chunk, "ns1:sourceInfo/ns1:timeZoneInfo/ns1:daylightSavingsTimeZone/@zoneOffset", namespaces = chunkNS))) + for (j in valuesIndex){ subChunk <- xmlRoot(xmlDoc(chunk[[j]])) methodID <- as.character(xpathSApply(subChunk, "ns1:method/@methodID", namespaces = chunkNS)) - methodID <- padVariable(methodID,2) + methodID <- zeroPad(methodID,2) value <- as.numeric(xpathSApply(subChunk, "ns1:value",namespaces = chunkNS, xmlValue)) - datetime <- as.POSIXct(strptime(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS),"%Y-%m-%dT%H:%M:%S")) - tzHours <- substr(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS), - 24, - nchar(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS))) - if(mean(nchar(tzHours),rm.na=TRUE) == 6){ - tzAbbriev <- zoneAbbrievs[tzHours] - } else { - tzAbbriev <- rep(as.character(zoneAbbrievs[1]),length(datetime)) - } - timeZoneLibrary <- setNames(c("America/New_York","America/New_York","America/Chicago","America/Chicago", - "America/Denver","America/Denver","America/Los_Angeles","America/Los_Angeles", - "America/Anchorage","America/Anchorage","America/Honolulu","America/Honolulu"), - c("EST","EDT","CST","CDT","MST","MDT","PST","PDT","AKST","AKDT","HAST","HST")) - timeZone <- as.character(timeZoneLibrary[tzAbbriev]) - if(length(unique(timeZone)) == 1){ - datetime <- as.POSIXct(as.character(datetime), tz = unique(timeZone)) + if(asDateTime){ + datetime <- as.POSIXct(strptime(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS),"%Y-%m-%dT%H:%M:%S"), tz="UTC") + + tzHours <- as.numeric(substr(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS), + 24, + nchar(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS))-3)) + tzHoursOff <- substr(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS), + 24, + nchar(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS))) + tzAbbriev <- as.character(zoneAbbrievs[tzHoursOff]) + + datetime <- datetime - tzHours*60*60 } else { - warning("Mixed time zone information") - for(i in seq_along(datetime)){ - datetime[i] <- as.POSIXct(as.character(datetime[i]), tz = timeZone[i]) - } + datetime <- as.Date(strptime(xpathSApply(subChunk, "ns1:value/@dateTime",namespaces = chunkNS),"%Y-%m-%dT%H:%M:%S")) } qualifier <- as.character(xpathSApply(subChunk, "ns1:value/@qualifiers",namespaces = chunkNS)) @@ -118,23 +111,43 @@ importWaterML1 <- function(obs_url){ assign(qualName,qualifier) if(length(get(qualName))!=0){ - df <- data.frame(rep(agency,length(datetime)), - rep(site,length(datetime)), - datetime, - tzAbbriev, - get(valueName), - get(qualName), - stringsAsFactors=FALSE) - - names(df) <- c("agency_cd","site_no","datetime","tz_cd",valueName,qualName) + if(asDateTime){ + df <- data.frame(rep(agency,length(datetime)), + rep(site,length(datetime)), + datetime, + tzAbbriev, + get(valueName), + get(qualName), + stringsAsFactors=FALSE) + + names(df) <- c("agency_cd","site_no","datetime","tz_cd",valueName,qualName) + } else { + df <- data.frame(rep(agency,length(datetime)), + rep(site,length(datetime)), + datetime, + get(valueName), + get(qualName), + stringsAsFactors=FALSE) + + names(df) <- c("agency_cd","site_no","datetime",valueName,qualName) + } } else { - df <- data.frame(rep(agency,length(datetime)), - rep(site,length(datetime)), - datetime, - tzAbbriev, - get(valueName),stringsAsFactors=FALSE) - - names(df) <- c("agency_cd","site_no","datetime","tz_cd",valueName) + if(asDateTime){ + df <- data.frame(rep(agency,length(datetime)), + rep(site,length(datetime)), + datetime, + tzAbbriev, + get(valueName),stringsAsFactors=FALSE) + + names(df) <- c("agency_cd","site_no","datetime","tz_cd",valueName) + } else { + df <- data.frame(rep(agency,length(datetime)), + rep(site,length(datetime)), + datetime, + get(valueName),stringsAsFactors=FALSE) + + names(df) <- c("agency_cd","site_no","datetime",valueName) + } } if (1 == i & valuesIndex[1] == j){ @@ -142,7 +155,6 @@ importWaterML1 <- function(obs_url){ } else { similarNames <- intersect(names(mergedDF), names(df)) mergedDF <- merge(mergedDF, df,by=similarNames,all=TRUE) -# mergedDF <- merge(mergedDF, df,by=c("agency_cd","site_no","datetime","tz_cd"),all=TRUE) } } } diff --git a/man/importWaterML1.Rd b/man/importWaterML1.Rd index 7528ebd33c15c4c2de2299355c82fef9a56aa3cd..2c7757783cb30eae99d82031f74f670a1383f6f3 100644 --- a/man/importWaterML1.Rd +++ b/man/importWaterML1.Rd @@ -3,10 +3,12 @@ \alias{importWaterML1} \title{Function to return data from the NWISWeb WaterML1.1 service} \usage{ -importWaterML1(obs_url) +importWaterML1(obs_url, asDateTime = FALSE) } \arguments{ \item{obs_url}{string containing the url for the retrieval} + +\item{asDateTime}{logical, if TRUE returns date and time as POSIXct, if FALSE, Date} } \value{ mergedDF a data frame containing columns agency, site, dateTime, values, and remark codes for all requested combinations @@ -21,7 +23,6 @@ startDate <- "2012-09-01" endDate <- "2012-10-01" offering <- '00003' property <- '00060' -urlBase <- "http://waterservices.usgs.gov/nwis" obs_url <- constructNWISURL(siteNumber,property,startDate,endDate,'dv') data <- importWaterML1(obs_url) urlMulti <- constructNWISURL("04085427",c("00060","00010"), @@ -34,7 +35,7 @@ groundwaterExampleURL <- constructNWISURL(groundWaterSite, NA, startGW,endGW, service="gwlevels", format="xml") groundWater <- importWaterML1(groundwaterExampleURL) unitDataURL <- constructNWISURL(siteNumber,property, - "2014-10-10","2014-10-10",'uv',format='xml') -unitData <- importWaterML1(unitDataURL) + "2013-11-03","2013-11-03",'uv',format='xml') +unitData <- importWaterML1(unitDataURL,TRUE) } diff --git a/man/readNWISunit.Rd b/man/readNWISunit.Rd index 1d0eb2228379d44accae5e54d5838b9613918621..5aa9b677935a877b9f11f635e9876154788b7a0d 100644 --- a/man/readNWISunit.Rd +++ b/man/readNWISunit.Rd @@ -36,6 +36,8 @@ rawData <- readNWISunit(siteNumber,parameterCd,startDate,endDate) summary(rawData) rawData2 <- readNWISunit(siteNumber,parameterCd,startDate,endDate,"tsv") summary(rawData2) +timeZoneChange <- readNWISunit(siteNumber,property, + "2013-11-03","2013-11-03") } \keyword{USGS} \keyword{data}