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)))
我有一个混乱的数据库来处理日期时间有时存储为 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)))