嗨,我正在嘗試將給定的日期轉換為各自的作業日,我有一個包含數百萬行的資料集,并且我只使用其中包含日期的列。
我目前正在使用
ifelse(wday(data$started_at)==1,7,wday(data$started_at)-1)
我希望將星期一表示為 1,將星期日表示為 7,但是,我并不在意,我寧愿有一個更快的程式。
作為您使用的試驗資料:
x<- rep("2022-02-01 00:00:04",1000000)
這是我目前擁有的
ifelse(wday(x)==1,7,wday(x)-1)
我試圖讓它更快,目前在我的電腦上需要 17 秒。
uj5u.com熱心網友回復:
這里不需要額外的ifelse和呼叫wday兩次。奇怪的是,下面的速度稍微快一些,并且給出了一個整數而不是來自的默認數字wday。
x <- sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 1e7, replace = T)
z <- c(7L, 1:6)
bench::mark(
x = wday(x, week_start = 1),
y = z[wday(x)]
)[c(3,5,7,9)]
median mem_alloc n_itr total_time
<bch:tm> <bch:byt> <int> <bch:tm>
1 1s 534MB 1 1s
2 879ms 534MB 1 879ms
uj5u.com熱心網友回復:
有一個引數lubridate::wday被呼叫week_start:
x<- "2022-02-01 00:00:04"
wday(x, week_start = 1)
uj5u.com熱心網友回復:
這應該會快一點,因為我不使用ifelse. 相反,我使用這個 base-R 解決方案,它依賴于format:
format(as.Date(x), "%u")
在我的筆記本電腦上,這大約需要 7.5 秒,其中 5 秒只是轉換為Date格式。因此,如果您的資料已經是日期格式,那么這個解決方案應該會更快。
如果在您的真實資料中您有很多重復的值(如在您的示例資料中),您可能會加快速度:首先應用format每個唯一值,然后將結果連接到您的完整資料中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442396.html
