生成随机日期

52

我如何在指定日期范围内生成一组12个随机日期?

我认为以下代码可以实现:

 sample(as.Date(1999/01/01), as.Date(2000/01/01),12)

但结果看起来像一组随机数字?

谢谢

5个回答

85

seq有一个适用于Date类的方法,可以实现此功能:

sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 12)

感谢您的快速回复! - AAA
我该如何将输出格式更改为诸如01/01/1999的格式? - AAA
2
请参阅?format.Date。要生成此格式,您需要使用格式字符串'%m/%d/%Y'(或者也许是'%d/%m/%Y'--因此我建议不要使用此格式)。 - Matthew Lundberg

12

有几种方法:

  1. 从一个单独的 Date 对象开始,然后将 sample() 的结果添加到其中。

  2. 从一系列 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> 

5

为了跟随基本的R函数,如rnormrnbinomrunif等,我创建了下面的函数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')

Histogram of rdate


3
td = as.Date('2000/01/01') - as.Date('1999/01/01')
as.Date('1999/01/01') + sample(0:td, 12)

0
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"

请注意使用 as.Date() 和 origin 参数。不确定为什么没有它们,代码就无法运行...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接