【问题标题】:Create n different dates in consecutive months from a starting year-month从起始年月开始连续几个月创建 n 个不同的日期
【发布时间】:2021-02-20 19:54:02
【问题描述】:

我有一个指定为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)
)

【问题讨论】:

  • 你开始写函数了吗?您似乎在使用seq.Date(很合适),从这里开始,只需在某个开始的年月和 T 个月后选择随机日期,对吧?
  • 阿德里安娜,欢迎来到 SO!如果其中一个答案解决了您的问题,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)

标签: r date


【解决方案1】:
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 为基础)访问一个月中的天数,这使得 sampleing 一个月中的天数变得相当简单。也可以使用lubridate 包来完成(代码高尔夫更短),但我不知道这比这段代码更正确。

这只是转储了一系列随机日期,每月有n 天。它不会在每个月内排序,但它会按顺序输出月份。 (这不是一个困难的扩展,只是没有要求。)它不输出框架,您可以轻松地扩展它以适应框架或在最后一行调用data.frame(date = do.call(c, dates)),具体取决于什么你需要处理输出。

【讨论】:

    【解决方案2】:

    您可以将开始时间转换为每月数据的类别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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      相关资源
      最近更新 更多