我嘗試使用將我的代碼發送到 sql 查詢的 dbplyr 包來計算大型資料庫的月份日期之間的差異。我嘗試了類似問題中建議的不同方法,但它們不起作用(例如下面的代碼)。Data2 是由創建的物件tbl()
Data2 %>% mutate(age_Months = (lubridate::interval(date_1, date_2)) / base::months(1))
#OR
library(lubridate)
Data2 %>% mutate(age_Months = TIMESTAMPDIFF(MONTH, date_1, date_2))
你有什么想法來計算差異嗎?隨意建議任何其他庫和功能,沒關系。我只需要月份的差異。謝謝
資料集如下。
Data2 %>% select(date_1, date_2) %>% head() %>% collect()
# date_1 date_2
# <chr> <chr>
#1 2015-05-01 00:00:00.0 2036-02-01 00:00:00.0
#2 2015-05-01 00:00:00.0 2036-01-01 00:00:00.0
#3 2015-05-01 00:00:00.0 2031-03-01 00:00:00.0
#4 2015-05-01 00:00:00.0 2035-12-01 00:00:00.0
#5 2015-05-01 00:00:00.0 2035-05-01 00:00:00.0
#6 2015-05-01 00:00:00.0 2032-03-01 00:00:00.0
我對它們進行了轉換,as.Date()但結果沒有任何差異。
Data2 %>% mutate(date_1 = as.Date(date_1),
date_2 = as.Date(date_2))
# date_1 date_2
# <date> <date>
#1 2018-08-01 2036-02-01
#2 2018-08-01 2036-06-01
#3 2018-08-01 2036-01-01
#4 2018-08-01 2034-08-01
#5 2018-08-01 2033-08-01
#6 2018-08-01 2035-03-01
uj5u.com熱心網友回復:
這里有兩種可能的方法。
1)使用潤滑脂
dbplyr 翻譯是為一些(但不是全部)lubridate 函式定義為一些(但不是全部)SQL 風格(當我上次測驗時)。所以我會先嘗試以下方法:
Data2 %>%
mutate(year1 = lubridate::year(date_1),
year2 = lubridate::year(date_2),
month1 = lubridate::month(date_1),
month2 = lubridate::month(date_2)) %>%
mutate(age_months = 12*(year2 - year1) month2 - month1) %>%
select(-year1, -year2, -month1, -month2)
2) 使用未翻譯的 SQL 函式
Impala 包含一個DATEDIFF函式(此處的檔案)。當 dbplyr 遇到一個沒有為其定義翻譯的命令時,它會將未翻譯的命令傳遞給資料庫。
所以類似于以下內容:
Data2 %>%
mutate(age_months = DATEDIFF(date_2, date_1) / 30)
應該像這樣翻譯成SQL:
SELECT *
,DATEDIFF(date_2, date_1) / 30 AS age_months
FROM data2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464727.html
