我如何在指定日期范围内生成一组12个随机日期?
我认为以下代码可以实现:
sample(as.Date(1999/01/01), as.Date(2000/01/01),12)
但结果看起来像一组随机数字?
谢谢
seq
有一个适用于Date
类的方法,可以实现此功能:
sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 12)
有几种方法:
从一个单独的 Date
对象开始,然后将 sample()
的结果添加到其中。
从一系列 Date
对象开始,然后对其进行 sample()
。
这是方法1:
R> set.seed(42)
R> res <- Sys.Date() + sort(sample(1:10, 3))
R> res
[1] "2014-02-04" "2014-02-10" "2014-02-11"
R>
为了跟随基本的R函数,如rnorm
、rnbinom
、runif
等,我创建了下面的函数rdate
,它可以根据Matthew Lundberg的被接受的答案返回随机日期。
默认范围是当前年份的第一天和最后一天。
rdate <- function(x,
min = paste0(format(Sys.Date(), '%Y'), '-01-01'),
max = paste0(format(Sys.Date(), '%Y'), '-12-31'),
sort = TRUE) {
dates <- sample(seq(as.Date(min), as.Date(max), by = "day"), x, replace = TRUE)
if (sort == TRUE) {
sort(dates)
} else {
dates
}
}
正如预期的那样,它返回有效日期:
> class(rdate(12))
[1] "Date"
随机性检查,生成一百万个今年的日期:
> hist(rdate(1000000), breaks = 'months')
td = as.Date('2000/01/01') - as.Date('1999/01/01')
as.Date('1999/01/01') + sample(0:td, 12)
generateRandomDate <- function(start_date, end_date) {
random_days <- sample(0:(as.numeric(end_date - start_date)), 1)
start_date + days(random_days)
}
> set.seed(0); sapply(1:12, function(x) generateRandomDate(ymd("2023-01-01"), ymd("2023-1-31")) ) %>% as.Date(origin = "1970-01-01")
[1] "2023-01-14" "2023-01-25" "2023-01-04" "2023-01-07" "2023-01-01" "2023-01-02" "2023-01-29" "2023-01-23" "2023-01-11" "2023-01-14" "2023-01-18" "2023-01-27"
?format.Date
。要生成此格式,您需要使用格式字符串'%m/%d/%Y'
(或者也许是'%d/%m/%Y'
--因此我建议不要使用此格式)。 - Matthew Lundberg