使用lubridate包mdy函数合并日期列报错:no such function: mdy
解决mdy函数找不到的问题
核心原因分析
错误提示no such function: mdy搭配Failed to collect lazy table,大概率你的yearly_data是数据库连接的懒加载表(比如用dbplyr连接的MySQL/PostgreSQL等),而非本地数据框。这种情况下,dplyr会尝试把mdy函数翻译成数据库可识别的SQL语句,但数据库本身没有mdy这个函数,因此触发报错。
对应解决方案
方案1:先拉取数据到本地处理(适合小数据量)
如果数据规模不大,直接将数据从数据库拉到本地,再用lubridate处理:
yearly_data_local <- collect(yearly_data) yearly_data_local %>% mutate(flight_date = lubridate::mdy(paste(Month, DayofMonth, Year))) %>% select(DepDelay, flight_date) %>% head(4)
方案2:用数据库原生日期函数处理(适合大数据量)
如果数据量过大无法全量拉取到本地,使用数据库支持的日期拼接函数:
- MySQL/MariaDB 环境用
STR_TO_DATE:
yearly_data %>% mutate(flight_date = sql("STR_TO_DATE(CONCAT(Month, '/', DayofMonth, '/', Year), '%m/%d/%Y')")) %>% select(DepDelay, flight_date) %>% head(4) %>% collect()
- PostgreSQL 环境用
TO_DATE:
yearly_data %>% mutate(flight_date = sql("TO_DATE(CONCAT(Month, '/', DayofMonth, '/', Year), 'MM/DD/YYYY')")) %>% select(DepDelay, flight_date) %>% head(4) %>% collect()
方案3:确认lubridate正确加载(本地数据框场景)
如果你的数据本来就是本地数据框,强制指定lubridate命名空间尝试:
yearly_data %>% mutate(flight_date = lubridate::mdy(paste(Month, DayofMonth, Year))) %>% select(DepDelay, flight_date) %>% head(4)
若仍无效,重启R会话后重新执行以下代码,避免其他包的同名函数冲突:
install.packages("lubridate") library(lubridate)
内容的提问来源于stack exchange,提问作者DefoANoob
相关产品推荐
相关产品推荐

