Tôi đã viết một hàm (khá ngây thơ) để chọn ngẫu nhiên một ngày/giờ giữa hai ngày quy địnhhiệu quả tạo ra một mẫu ngẫu nhiên của thời gian và ngày giữa hai ngày
# set start and end dates to sample between
day.start <- "2012/01/01"
day.end <- "2012/12/31"
# define a random date/time selection function
rand.day.time <- function(day.start,day.end,size) {
dayseq <- seq.Date(as.Date(day.start),as.Date(day.end),by="day")
dayselect <- sample(dayseq,size,replace=TRUE)
hourselect <- sample(1:24,size,replace=TRUE)
minselect <- sample(0:59,size,replace=TRUE)
as.POSIXlt(paste(dayselect, hourselect,":",minselect,sep=""))
}
mà kết quả trong:
> rand.day.time(day.start,day.end,size=3)
[1] "2012-02-07 21:42:00" "2012-09-02 07:27:00" "2012-06-15 01:13:00"
Nhưng điều này dường như chậm lại đáng kể khi kích thước mẫu tăng lên.
# some benchmarking
> system.time(rand.day.time(day.start,day.end,size=100000))
user system elapsed
4.68 0.03 4.70
> system.time(rand.day.time(day.start,day.end,size=200000))
user system elapsed
9.42 0.06 9.49
Có ai có thể đề xuất cách làm điều gì đó như thế này một cách hiệu quả hơn không?
Chúc mừng - làm việc một điều trị và nhanh chóng. – thelatemail
Quy tắc đầu tiên về làm việc với ngày và giờ: * luôn luôn * hãy nhớ rằng 'POSIXct' thực sự chỉ là một số có số giây phân số từ theepoch. Dito cho 'Ngày' và các ngày phân số. Rất nhiều vấn đề trở thành * rất nhiều * dễ dàng hơn theo cách đó. –
Thiên tài của câu trả lời này là thủ thuật 'st + ev' - đó là vòng tròn tới' POSIXct' gây đau đớn, vì bạn cần xác định rõ nguồn gốc. Nếu không 'runif (N, as.POSIXct (st), as.POSIXct (et))' sẽ cho bạn 90% số này; nhưng sau đó bạn cần 'as.POSIXct (..., origin =" 1970-01-01 ")' – user295691