使用sqldf合并带时间字段的dataframe后时间不准确如何解决
问题原因
该时间偏移由时区不统一导致:
lubridate::as_datetime()默认使用UTC时区解析日期sqldf处理POSIXct(日期时间类型)数据时,会自动转换为操作系统的本地时区,国内通常为UTC+8时区,二者的时间差就是固定出现18:00/19:00偏移的原因。
最优解决方法
因为你只需要按日期范围做匹配,不需要用到时分秒信息,直接将日期字段转为Date类型即可彻底避免时区问题,修改后的代码如下:
library(dplyr) library(tidyr) library(lubridate) library(sqldf) df11 <- df1 %>% separate(DateTime, c("Date", "Time"), sep=" ") %>% # 改为转成Date类型,不带时区属性 mutate(Date = as.Date(mdy(Date))) %>% select(-Time) %>% as_tibble() df22 <- df2 %>% # 直接转成Date类型 mutate(EncounterDate = as.Date(mdy(EncounterDate))) %>% as_tibble() df11 <- mutate(df11, Date_m30 = Date %m-% days(30), Date_p30 = Date %m+% days(30)) df3 <- sqldf::sqldf(" select df11.*, df22.DOB, df22.EncounterDate, df22.Type, df22.responses from df11 left join df22 on df11.UserID = df22.UserID and df22.EncounterDate between df11.Date_m30 and df11.Date_p30") %>% select(-Date_m30, -Date_p30)
备用方案(需保留时分秒时使用)
如果业务场景需要保留日期时间的时分秒信息,在转换日期时统一指定时区即可:
# 转换时指定和本地一致的时区 mutate(Date = as_datetime(mdy(Date), tz = Sys.timezone())) mutate(EncounterDate = as_datetime(mdy(EncounterDate), tz = Sys.timezone()))
内容的提问来源于stack exchange,提问作者Ash S
相关产品推荐
相关产品推荐

