将具有不同单位的期限(时间段)的特征向量添加到日期
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"
我必须向日期添加 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"