Я работаю с наборами данных временных рядов и хочу собирать годовые данные, не основанные на календарных годах. Итак, скажем, для местоположения, которое я хочу объединить с октября по сентябрь, как apply.yearly
. У меня есть версия, которая работает с декабря по март, но из-за високосных лет она терпит неудачу. Я использую endpoints
в zoo
, чтобы сделать это. Я хотел бы изменить эту функцию для поддержки високосных лет.
Функция:
apply.wateryear <- function(x, FUN, wateryearmon = 10, on = 'days', ...) {
wateryearmon <- as.numeric(wateryearmon)
yearlyendpoints <- endpoints(x, 'years')
# Adjusting Water Year
FirstYear <- format(index(x[1]), '%Y')
FirstDayWY <- as.numeric(format(as.Date(paste(FirstYear, wateryearmon, '01', sep = '-')), '%j'))
LastDay <- as.numeric(format(as.Date(paste(FirstYear, '12', '31', sep = '-')), '%j'))
# Loosely supporting daily and monthly
if(on == 'days' | on == 'day') {
WYAdjust <- LastDay - FirstDayWY + 1
} else if (on == 'months' | on == 'month') {
WYAdjust <- 12 - wateryearmon + 1
} else stop('Unknown periods string (on)')
# Shifting yearly to Month
yearlyendpoints <- yearlyendpoints - WYAdjust
# If first value is negative, replace with a zero
if(yearlyendpoints[1] < 0) yearlyendpoints[1] <- 0
# Last Value should be last of the data
if(as.numeric(format(as.Date(index(x[tail(yearlyendpoints, n = 1)])), '%j')) - FirstDayWY < 0) yearlyendpoints <- c(yearlyendpoints[-length(yearlyendpoints)], length(x))
return(period.apply(x, yearlyendpoints, FUN, ...))
}
Быстрое использование образца:
sampleData <- xts::xts(runif(2000), order.by = seq(from = as.Date('2020-10-01'), by = 'days', length.out = 2000))
apply.wateryear(sampleData, sum, 10)
Однако я хотел бы также расширить это для поддержки февраля, так что apply.wateryear(sampleData, sum, 2)
не выключен на один день.
Спасибо!