Агрегирование данных по годам на основе разных месяцев с использованием XTS - PullRequest
1 голос
/ 29 января 2020

Я работаю с наборами данных временных рядов и хочу собирать годовые данные, не основанные на календарных годах. Итак, скажем, для местоположения, которое я хочу объединить с октября по сентябрь, как 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) не выключен на один день.

Спасибо!

...