R中的随机时间戳生成

Random timestamp generation in R

我有关于通话信息的数据(大约 300 万行)。

caller
user_1   
user_2   
user_3   
user_N 

我需要为每个 user 调用再创建一个带有随机时间戳的列,即我想得到这样的东西:

caller timestamp
user_1 2019-12-24 21:00:07
user_2 2019-12-27 20:03:19
user_3 2020-01-11 19:30:54
user_N 2020-02-15 22:37:12

由于限制,时间只能在18:00:0023:59:59之间,日期必须在Jan 1, 2019Jan 1, 2021之间。

是否可以在 R 中实现?也许有一些功能可以在这里有用?
如有任何帮助,我将不胜感激!

给定的数据框 ID 为:

df <- data.frame(caller = 1:3E6)

你可以运行

df$timestamp = as.POSIXct("2019-01-01 00:00", tz = "GMT") + 
   floor(runif(nrow(df), max = 365))*24*60*60 + 
   runif(nrow(df), min = 18*60*60, max = 24*60*60)

这将添加一个统一的随机天数,以及一个介于 18 到 24 小时之间的随机秒数。

我们可以验证时间戳是否在所需范围内:

range(df$timestamp)
range(lubridate::hour(df$timestamp) + lubridate::minute(df$timestamp)/60)

在一个范围内生成随机时间戳的一种方法是使用seq函数生成范围内所有可能时间戳的序列,然后随机select n 使用 sample 函数从他们那里获取时间戳。比如你想在Jan 1, 2021Jan 3, 2021之间生成3个随机时间戳,以second为单位,你可以这样做:

set.seed(1)
seq(as.POSIXct("2021-01-01 00:00:00") ,as.POSIXct("2021-01-03 23:59:59"), by = "s") |> 
sample(3)

#[1] "2021-01-01 06:46:27 +07" "2021-01-03 04:56:32 +07"
#[3] "2021-01-02 10:33:32 +07"

注意:您可以在as.POSIXct函数中使用tz指定您自己的时区。

通过这种方式,您可以通过以下步骤获得300万个随机时间戳:

  1. 将每日范围的开始和结束分别设置为 18:00:0023:59:59
starts <- seq(as.POSIXct("2019-01-01 18:00:00"), as.POSIXct("2021-01-01 18:00:00"), 
       by = "days")
ends <- seq(as.POSIXct("2019-01-01 23:59:59"), as.POSIXct("2021-01-01 23:59:59"), 
       by = "days")
  1. 计算每天的样本数
ndays = length(starts)
n = 3e6/ndays
  1. 每天从所有可能的时间戳中随机 selectn 个样本,并且 将样本存储在列表中。
sampled_timestamps <- vector("list", ndays)
for (k in 1:ndays) {
      sampled_timestamps[[k]] <- seq(starts[k], ends[k], by = "hours") |>
      sample(n)
}
  1. sampled_timestamps 转换为向量,以便能够将其用作数据框中的列。
v_sampled_timestamps <- do.call("c", sampled_timestamps)

现在您可以使用 v_sampled_timestamps 填写数据框中 timestamps 列的值。

your_df$timestamps <- v_sampled_timestamps