簡體   English   中英

從起始年月開始連續幾個月創建 n 個不同的日期

[英]Create n different dates in consecutive months from a starting year-month

我將開始時間指定為year-month字符,例如“2020-12”。 從一開始,對於每個連續的T個月,我需要生成n不同的日期(年-月-日),其中日期是隨機的。

任何幫助都會很有用!

我正在處理的數據:

data <- data.frame(
  data = sample(seq(as.Date('2000/01/01'), as.Date('2020/01/01'), by="day"), 500),
  price = round(runif(500, min = 10, max = 20),2),
  quantity = round(rnorm(500,30),0)
)
func <- function(start, months, n) {
  startdate <- as.Date(paste0(start, "-01"))
  enddate <- seq(startdate, by = "month", length.out = months)
  months <- seq_len(months)
  enddate_lt <- as.POSIXlt(enddate)
  enddate_lt$mon <- enddate_lt$mon + 1
  enddate_lt$mday <- enddate_lt$mday - 1
  days_per_month <- as.integer(format(enddate_lt, format = "%d"))
  days <- lapply(days_per_month, sample, size = n)
  dates <- Map(`+`, enddate, days)
  do.call(c, dates)
}

set.seed(2021)
func("2020-12", 4, 3)
#  [1] "2020-12-08" "2020-12-07" "2020-12-15" "2021-01-27" "2021-01-08" "2021-01-13" "2021-02-21" "2021-02-07" "2021-02-28"
# [10] "2021-03-28" "2021-03-07" "2021-03-15"
func("2020-12", 5, 2)
#  [1] "2020-12-06" "2020-12-16" "2021-01-08" "2021-01-10" "2021-02-24" "2021-02-13" "2021-03-20" "2021-03-29" "2021-04-19"
# [10] "2021-04-28"
func("2020-12", 2, 10)
#  [1] "2020-12-29" "2020-12-30" "2020-12-04" "2020-12-15" "2020-12-09" "2020-12-27" "2020-12-05" "2020-12-06" "2020-12-23"
# [10] "2020-12-17" "2021-01-03" "2021-01-20" "2021-01-05" "2021-01-22" "2021-01-23" "2021-01-06" "2021-01-10" "2021-01-07"
# [19] "2021-01-19" "2021-01-12"

POSIXlt對象共舞的大部分原因是因為它使我們能夠干凈地(以 R 為基礎)訪問一個月中的天數,這使得對一個月中的天數進行sample變得相當簡單。 也可以使用lubridate package 來完成(代碼高爾夫更短),但我不知道這比這段代碼更正確。

這只是轉儲了一系列隨機日期,每個月有n天。 它不會在每個月內進行排序,盡管它會按月份順序執行 output。 (這不是一個困難的擴展,只是沒有要求。)它不輸出框架,您可以輕松擴展它以適應框架或調用data.frame(date = do.call(c, dates))在最后一行,具體取決於您需要對 output 做什么。

您可以將開始時間轉換為 class 以獲取每月數據zoo::yearmon 然后使用as.Date.yearmon及其frac參數(“一個介於 0 和 1 之間的數字,表示結果所代表的時間段的分數”)與來自runif的隨機值(0 和 1 之間的統一)進行轉換到每個年月內的隨機日期。

start = "2020-12"
T = 3
n = 2

library(zoo)
set.seed(1)
as.Date(as.yearmon(start) + rep((1:T)/12, each = n), frac = runif(T * n))
# [1] "2021-01-08" "2021-01-12" "2021-02-16" "2021-02-25" "2021-03-07" "2021-03-27"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM