apply.monthly 不适用于函数(xts 和 POSIXct 文件)
apply.monthly won't work with function (xts and POSIXct files)
我最近开始使用 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
的值求和并在 <= 小于 20 分钟时将其存储在变量 x 中,或者在 x 上加 20 并将剩余的 difftime 存储在变量 y 中difftime
> 20 分钟
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 = "")))
}
此函数在处理“as.POSIXct”对象(格式日期)时工作得很好,但当我尝试运行它处理“xts”对象(xtsdata)时将不起作用.这样做时,出现以下错误:do not know how to convert 'x' to class “POSIXlt”
。为什么x是时差时要改成POSIXct
?
下一步,我也无法开始工作,是使用 apply.monthly 到这个函数使用 `apply.monthly(xtsdata,myfun).
目前,在尝试使用 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”
任何关于如何使我的功能正常工作以及如何应用 apply.monthly
的建议都会有很大帮助。
感谢您的帮助!
编辑以获取更多详细信息:(sid:气象数据的标识,我不需要该列),time = date,value = rainfall
> 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"
我必须根据这些数据 (mesdonnees) 估算每月的降雨量。初始数据在精确时间给出 "Instant precipitations",我应该每 10 分钟有一个值。但是,情况并非如此,有时直到几天后我才得到值(并且没有 NA
行注意到缺失值)。
我希望这个解释更好?
您可能可以将 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)
我最近开始使用 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
的值求和并在 <= 小于 20 分钟时将其存储在变量 x 中,或者在 x 上加 20 并将剩余的 difftime 存储在变量 y 中difftime
> 20 分钟
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 = "")))
}
此函数在处理“as.POSIXct”对象(格式日期)时工作得很好,但当我尝试运行它处理“xts”对象(xtsdata)时将不起作用.这样做时,出现以下错误:do not know how to convert 'x' to class “POSIXlt”
。为什么x是时差时要改成POSIXct
?
下一步,我也无法开始工作,是使用 apply.monthly 到这个函数使用 `apply.monthly(xtsdata,myfun).
目前,在尝试使用 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”
任何关于如何使我的功能正常工作以及如何应用 apply.monthly
的建议都会有很大帮助。
感谢您的帮助!
编辑以获取更多详细信息:(sid:气象数据的标识,我不需要该列),time = date,value = rainfall
> 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"
我必须根据这些数据 (mesdonnees) 估算每月的降雨量。初始数据在精确时间给出 "Instant precipitations",我应该每 10 分钟有一个值。但是,情况并非如此,有时直到几天后我才得到值(并且没有 NA
行注意到缺失值)。
我希望这个解释更好?
您可能可以将 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)