as.POSIXct 在函数而不是 DateTime 中使用时返回双精度值

as.POSIXct returning a double when used in a function instead of DateTime

我有一个混乱的数据库来处理日期时间有时存储为 24 小时格式,没有秒,而其他时候它存储为 12 小时格式,最后带有 AM/PM(可能有发生在 Windows 更新我们的测量计算机或其他东西时,我不知道)。

我想使用 as.POSIXct 将 DateTime 字符串转换为可用的 DateTime 对象,但是当我尝试使用以下代码时,它被转换为双精度(检查 class 它也是数字)

main_function <- function(res_df)
{
 res_df <- res_df %>%
    mutate(DateTime = sapply(DateTime, date_time_convert))
}


date_time_convert <- function(dt_string, tz="Europe/Amsterdam")
{
  if(str_detect(dt_string, "M")){
    dt_format <- "%m/%d/%Y %I:%M:%S %p"
  }else
  {
    dt_format <- "%m/%d/%Y %H:%M"
  }
  
 as.POSIXct(dt_string, format=dt_format, tz=tz)
}

当我调试时,代码在函数中正确执行(returns 一个 DateTime 对象),但是当它进入我的数据帧时,日期都被转换成双精度。

sapply 和类似的并不总是能很好地使用 POSIXt 作为输出。这是一个替代方法:使用 do.call(c, lapply(..., date_time_convert)).

示例数据演示:

vec <- c("2021-01-01", "2022-01-01")

### neither 'sapply(..)' nor 'unlist(lapply(..))' work
sapply(vec, as.POSIXct)
# 2021-01-01 2022-01-01 
# 1609477200 1641013200 
unlist(lapply(vec, as.POSIXct))
# [1] 1609477200 1641013200

do.call(c, lapply(vec, as.POSIXct))
# [1] "2021-01-01 EST" "2022-01-01 EST"

这意味着您的代码将是

res_df %>%
  mutate(DateTime = do.call(c, lapply(DateTime, date_time_convert)))