Добавить символьный вектор теноров (периодов времени) с разными единицами измерения к дате - PullRequest
0 голосов
/ 07 января 2019

Я должен добавить к дате вектор теноров , периодов времени.

Теноры представляют собой объединенные строки со значением и единицей времени, где единицами являются неделя (W), месяц (M) или год (Y):

tenor <- c('2W', '6M', '1Y', '2Y', '5Y')

Я хочу добавить каждый период к дате: 06/12/2018:

06/12/2018 + 2W
06/12/2018 + 6M
06/12/2018 + 1Y
06/12/2018 + 2Y
06/12/2018 + 5Y

Вектор может быть изменен, поэтому я не могу жестко закодировать эти периоды.

Я пытался использовать POSIXlt, но он не работает, и я не уверен, почему. При запуске цикла ответы на новую дату не имеют смысла.

Большое спасибо!

tenor <- c('2W', '6M', '1Y', '2Y', '5Y')

k <- nchar(tenor)
end <- substr(tenor, k, k)
start <- substr(tenor, 1, k - 1)
start <- as.numeric(start)
n <- length(tenor)

time_0 <- as.Date('06-12-2018', '%d-%m-%Y')
date1 <- as.POSIXlt(time_0)

new_date <- vector(mode = 'double', n)

for(i in 1:n){
  if(end[i] == 'Y'){
    date1$year <- date1$year + start[i]
    new_date[i] <- as.Date(date1)} 
}

Ответы [ 2 ]

0 голосов
/ 08 января 2019

В base вы можете использовать seq.Date и аргумент by. Последовательность длины 2 создается с даты начала с шагом, соответствующим значению и единице вашего тенора. Таким образом, второй элемент в последовательности является результатом сложения.

# convert date to class Date
d <- as.Date('06-12-2018', '%d-%m-%Y')

# grab number from period
n <- as.numeric(gsub("[^[:digit:]]", "", x))

# create lookup vector for units
units <- setNames(c("week", "month", "year"), c("W", "M", "Y"))

# grab units from period and convert to form that seq.Date can parse
unit <- units[gsub("[[:digit:]]", "", x)]

# seq.Date function which takes start date, unit and number, select second element
f <- function(date, unit, n){
  seq(from = date, by = paste(n, unit), length = 2)[2]
}

# use mapply to loop over vector arguments. Coerce back to Date
as.Date(mapply(f, d, unit, n), origin = "1970-01-01")
# [1] "2018-12-20" "2019-06-06" "2019-12-06" "2020-12-06" "2023-12-06"
0 голосов
/ 08 января 2019

Я не знаю, что такое тенор, но они похожи на даты / периоды времени. Поэтому мы будем использовать пакет lubridate для преобразования их в периоды, а затем добавим их к начальной дате. Исходя из предоставленных вами данных, это выглядит так, как вы хотели. Обратите внимание, что вам нужна строчная буква m для месяцев (или месяцев записи), потому что lubridate интерпретирует M как минуты.

> tenor <- period(c('2W', '6m', '1Y', '2Y', '5Y'))
> tenor
[1] "14d 0H 0M 0S"      "6m 0d 0H 0M 0S"    "1y 0m 0d 0H 0M 0S" "2y 0m 0d 0H 0M 0S" "5y 0m 0d 0H 0M 0S"
> time_0 <- as.Date('06-12-2018','%d-%m-%Y')
> date1 + tenor
[1] "2018-12-20 UTC" "2019-06-06 UTC" "2019-12-06 UTC" "2020-12-06 UTC" "2023-12-06 UTC"

Редактирование, предложенное другим пользователем: если у вас длинный тенор-вектор и вам необходимо заменить все значения «M» на «m», вы можете использовать

tenor <- gsub('M', 'm', tenor)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...