apply.monthly不能用于函数(xts和POSIXct文件)

时间:2017-05-17 16:27:47

标签: r apply xts posixct

我最近开始使用R编写我的硕士论文并且还在学习。

为了处理一些气象数据,我尝试创建一个函数。 原始文件是带有日期和降雨量的csv文件。 我提取了日期并创建了一个包含所有日期的POSIXct对象,然后创建了一个包含我的日期和降雨量的xts对象。

mesdonnees <- mesdonnees[26000:30000,]

require('xts')

# Extract characters and define as S....
Syear <- substr(mesdonnees$time, 1, 4)
Smonth <- substr(mesdonnees$time, 6,7)
Sday <- substr(mesdonnees$time, 9, 10)
Shour <- substr(mesdonnees$time, 12, 13)
Sminutes <- substr(mesdonnees$time, 15, 16)

#Gather all parts and use "-" as sep
datetext <- paste(Syear, Smonth, Sday, Shour, Sminutes, sep="-")
#define format of each part of the string
formatdate <- as.POSIXct(datetext, format="%Y-%m-%d-%H-%M", tz = "GMT")

xtsdata <- xts(mesdonnees[,2:3], order.by = formatdate, header = TRUE)

然后我写了一个函数,它将difftime的值加起来,并在它是&lt; =超过20分钟时将其存储在变量x中,或者将20加到x并将剩余的difftime存储在变量y中{ {1}}是&gt; 20分钟

difftime

当使用'as.POSIXct'对象(formatdate)时,此函数工作正常,但当我尝试使用'xts'对象(xtsdata)运行它时,它将无法工作。这样做时,我收到以下错误:myfun <- function(CHANGE){ # CHANGE = formatdate or xtsdata x <- as.difftime(0,format = "%M", units = "mins") y <- as.difftime(0,format = "%M", units = "mins") for (i in 2:length(CHANGE)) { if (difftime(CHANGE[i],CHANGE[i-1],units = "mins") <= as.difftime(20,format = "%M",units = "mins")) { x <- x + difftime(CHANGE[i],CHANGE[i-1],units = "mins") } else { x <- x + 20 y <- y + difftime(CHANGE[i],CHANGE[i-1],units = "mins") - 20 } } return(list(paste("x = ",x , sep = ""),paste("y = ",y , sep = ""))) } 。为什么在时差时将x更改为do not know how to convert 'x' to class “POSIXlt”

我无法使用的下一步是使用apply.monthly(xtsdata,myfun)将apply.monthly用于此函数。

目前,在尝试使用POSIXct时,我收到以下错误:apply.monthly(formatdate,myfun)

并且在尝试Error in if (difftime(CHANGE[i], CHANGE[i - 1], units = "mins") <= as.difftime(20, : missing value where TRUE/FALSE needed时出现以下错误:apply.monthly(xtsdata,myfun)

有关如何使我的功能正常工作以及如何应用Error in as.POSIXlt.default(x, tz, ...) : do not know how to convert 'x' to class “POSIXlt”的任何建议都会有很大帮助。 谢谢你的帮助!

编辑以获取更多详细信息:( sid:识别meteo数据,我不需要该列),time = date,value = rainfall

apply.monthly

我必须从这些数据(mesdonnees)估算每月的降雨量。初始数据在精确的时间给出“瞬间沉淀”,我应该每10分钟有一个值。但是,情况并非如此,有时我几天之前就没有值(并且没有> head(mesdonnees) sid time value 26000 100 2010-07-14 11:50:00 0 26001 100 2010-07-14 12:10:00 0 26002 100 2010-07-14 12:20:00 0 26003 100 2010-07-14 12:30:00 0 26004 100 2010-07-14 12:41:00 0 26005 100 2010-07-14 12:50:00 0 > head(formatdate) [1] "2010-07-14 11:50:00 GMT" "2010-07-14 12:10:00 GMT" [3] "2010-07-14 12:20:00 GMT" "2010-07-14 12:30:00 GMT" [5] "2010-07-14 12:41:00 GMT" "2010-07-14 12:50:00 GMT" > head(xtsdata) time value 2010-07-14 11:50:00 "2010-07-14 11:50:00" " 0.00" 2010-07-14 12:10:00 "2010-07-14 12:10:00" " 0.00" 2010-07-14 12:20:00 "2010-07-14 12:20:00" " 0.00" 2010-07-14 12:30:00 "2010-07-14 12:30:00" " 0.00" 行注意到缺失的值)。 我希望这个解释更好吗?

1 个答案:

答案 0 :(得分:0)

您可以将CSV直接读取到xts或zoo对象中。但是,您没有在CSV中指定数据的格式,因此我的答案将假设mesdonnees是data.frame。

由于您不需要sid列,因此您需要做的就是创建xts对象:

xtsdata <- xts(mesdonnees$value, as.POSIXct(mesdonnees$time))

如果mesdonnees$time是一个因素,您需要先将其转换为字符。

xtsdata <- xts(mesdonnees$value, as.POSIXct(as.character(mesdonnees$time)))

然后,您可以使用您想要使用的任何函数调用apply.monthly(xtsdata, ...),以按月创建汇总统计信息。例如:

apply.monthly(xtsdata, quantile)