将具有不同单位的男高音(时间段)的字符向量添加到日期

时间:2019-01-07 20:53:06

标签: r date add

我必须在日期上添加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)} 
}

2 个答案:

答案 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"