将具有不同单位的期限(时间段)的特征向量添加到日期

Add a character vector of tenors (time periods) with different units to a date

我必须向日期添加 tenors、时间段的矢量。

期限是具有值和时间单位的连接字符串,其中单位是周 (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)} 
}

我不知道男高音是什么,但那些看起来像 dates/time 句点。所以我们将使用 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)

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"