正如@joran 建议的那样,在 SQLlite 中以文本形式保存日期似乎是目前最好的方法。
我使用@Richard Knight 的方法进行转换,但使用 ISO 格式,在写入数据帧之前将日期更改为字符串:
local_df %>% mutate(across(where(lubridate::is.Date), ~ format(.x, "%Y-%m-%d")))
可以使用 sql 翻译远程操作日期,特别是:
remote_df %>% mutate(date_as_number = julianday(date_as_string))
remote_df %>% mutate(date_as_string = date(date_as_number))
Nbdate
不在as.Date
第二个中。这是因为as.Date
将被转换为,CAST(date_as_number AS DATE)
而我们想要的是使用 SQLLite 的date()
函数和julianday()
.
可以自动将远程日期字符串映射回日期,如果您:
collect <- function(remote_df, ...) {
raw = remote_df %>% dplyr::collect(...)
isoDateString = function(x) return(is.character(x) & all(na.omit(stringr::str_detect(x,"[0-9]{4}-[0-9]{2}-[0-9]{2}"))) & !all(is.na(x)))
raw = raw %>% mutate(across(where(isoDateString), ~ as.Date(.x, "%Y-%m-%d")))
maybeJulian = function(x) {return(is.double(x) & all(na.omit(x>2440587.5)) & all(na.omit(x<2488069.5)) & !all(is.na(x)))}
raw = raw %>% mutate(across(matches(".*(D|d)ate.*") & where(maybeJulian), ~ as.Date(.x-2440587.5, "1970-01-01")))
return(raw)
}
函数中明显的随机数maybeJulian
对应于1970-01-01
和2100-01-01