我有關于呼叫資訊的資料(大約 300 萬行)。
caller
user_1
user_2
user_3
user_N
我需要為每個呼叫再創建一個帶有隨機時間戳的列user,即我想要得到這樣的東西:
| 呼叫者 | 時間戳 |
|---|---|
| 用戶_1 | 2019-12-24 21:00:07 |
| 用戶_2 | 2019-12-27 20:03:19 |
| 用戶_3 | 2020-01-11 19:30:54 |
| 用戶_N | 2020-02-15 22:37:12 |
由于限制,時間只能在18:00:00和之間23:59:59,日期必須在從Jan 1, 2019到的范圍內Jan 1, 2021。
是否有可能實作這一點R?也許這里有一些有用的功能?
如果有任何幫助,我將不勝感激!
uj5u.com熱心網友回復:
給定具有 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)
uj5u.com熱心網友回復:
在一個范圍內生成隨機時間戳的一種方法是使用函式生成該范圍內所有可能的時間戳的序列seq,然后使用函式從中隨機選擇n個時間戳sample。例如,如果你想在Jan 1, 2021和之間生成 3 個隨機時間戳Jan 3, 2021,以 為單位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"
注意:您可以使用in函式指定自己的時區。tzas.POSIXct
通過這種方法,您可以通過以下步驟獲得 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
- 從每天所有可能的時間戳中隨機選擇 n 個樣本,并將樣本存盤在一個串列中。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/461643.html
上一篇:計算日期之間的平均天數不斷更新
