2014-02-01 5 views
13

Как я могу сгенерировать набор из 12 случайных дат в пределах определенного диапазона дат?Генерация случайных дат

Я думал, что следующее будет работать:

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

Но результат выглядит как случайный набор чисел?

Спасибо

ответ

28

seq имеет метод класса Date, который работает для этого:

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

Спасибо за быстрый ответ! – AAA

+0

Как я могу изменить формат вывода в формате 01/01/1999? – AAA

+0

См. '? Format.Date'. Чтобы создать этот формат, вам нужна строка формата «% m /% d /% Y» (или, возможно, ''% d /% m /% Y'' - по этой причине я рекомендую в этом формате). –

8

несколькими способами:

  1. Начните с одного Date объекта, и просто добавить результат от sample()

  2. Start с последовательностью 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> 
2
td = as.Date('2000/01/01') - as.Date('1999/01/01') 
as.Date('1999/01/01') + sample(0:td, 12) 
1

Чтобы следовать базовые функции R, как rnorm, rnbinom, runif и другие, я создал функцию rdate ниже, чтобы вернуть случайные даты на основе accepted answer of 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

Смежные вопросы