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:00
到23:59:59
之间,日期必须在Jan 1, 2019
到Jan 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, 2021
和Jan 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万个随机时间戳:
- 将每日范围的开始和结束分别设置为
18:00:00
和 23: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")
- 计算每天的样本数
ndays = length(starts)
n = 3e6/ndays
- 每天从所有可能的时间戳中随机 selectn 个样本,并且
将样本存储在列表中。
sampled_timestamps <- vector("list", ndays)
for (k in 1:ndays) {
sampled_timestamps[[k]] <- seq(starts[k], ends[k], by = "hours") |>
sample(n)
}
- 将
sampled_timestamps
转换为向量,以便能够将其用作数据框中的列。
v_sampled_timestamps <- do.call("c", sampled_timestamps)
现在您可以使用 v_sampled_timestamps
填写数据框中 timestamps
列的值。
your_df$timestamps <- v_sampled_timestamps
我有关于通话信息的数据(大约 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:00
到23:59:59
之间,日期必须在Jan 1, 2019
到Jan 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, 2021
和Jan 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万个随机时间戳:
- 将每日范围的开始和结束分别设置为
18:00:00
和23: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")
- 计算每天的样本数
ndays = length(starts)
n = 3e6/ndays
- 每天从所有可能的时间戳中随机 selectn 个样本,并且 将样本存储在列表中。
sampled_timestamps <- vector("list", ndays)
for (k in 1:ndays) {
sampled_timestamps[[k]] <- seq(starts[k], ends[k], by = "hours") |>
sample(n)
}
- 将
sampled_timestamps
转换为向量,以便能够将其用作数据框中的列。
v_sampled_timestamps <- do.call("c", sampled_timestamps)
现在您可以使用 v_sampled_timestamps
填写数据框中 timestamps
列的值。
your_df$timestamps <- v_sampled_timestamps