我必须在日期上添加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)}
}
答案 0 :(得分:2)
我不知道男高音是什么,但是看起来像日期/时间段。因此,我们将使用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)
答案 1 :(得分:0)
在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"