如何正确使用 ifelse 来处理 R 中的时间戳突变?



我试图将时间戳分解为一小时的日期。csv 中的时间戳如下所示:2018-12-17T12:25:00Z。时间戳本身没有 NA 或异常情况。但是当我运行代码块时

x %>% 
mutate(
chicago_mkt_interval = with_tz(gmt_mkt_interval, "America/Chicago"),
pricedate = as_date(floor_date(chicago_mkt_interval - minutes(1), "day")),
hour = hour(ceiling_date(chicago_mkt_interval - minutes(1), "hour")),
hour = ifelse(hour == 0L, 24L, hour),
minute = minute(chicago_mkt_interval - minutes(1)) + 1
) %>% 
select(-chicago_mkt_interval) %>% 
select(pricedate, hour, gmt_mkt_interval, everything())

我收到错误

Error in mutate_impl(.data, dots) : 
Evaluation error: missing value where TRUE/FALSE needed.
Calls: %>% ... <Anonymous> -> mutate -> mutate.tbl_df -> mutate_impl -> .Call

回溯的片段在这里:

Error: Column `4` cannot have NA as name 
12.
stop(structure(list(message = "Column `4` cannot have NA as name", 
call = NULL, cppstack = NULL), class = c("Rcpp::exception", 
"C++Error", "error", "condition"))) 
11.
mutate_impl(.data, dots, caller_env()) 
10.
mutate.tbl_df(., chicago_mkt_interval = with_tz(gmt_mkt_interval, 
"America/Chicago"), pricedate = as_date(floor_date(chicago_mkt_interval - 
minutes(1), "day")), hour = hour(ceiling_date(chicago_mkt_interval - 
minutes(1), "hour")), hour = ifelse(hour == 0L, 24L, hour),  ... 

我是 R 的新手,所以不确定是修复或改进错误处理的最佳方法。

您可以尝试将时间戳转换为类POSIXct,然后从中提取日期和时间。

library(dplyr)
library(lubridate)
x %>%
mutate(chicago_mkt_interval = ymd_hms(gmt_mkt_interval), 
pricedate = as.Date(chicago_mkt_interval), 
hour = hour(chicago_mkt_interval))

或在基数 R 中

x$chicago_mkt_interval <- as.POSIXct(x$gmt_mkt_interval, 
format = '%Y-%m-%dT%T', tz = "UTC")
transform(x, pricedate = as.Date(chicago_mkt_interval), 
hour = as.integer(format(chicago_mkt_interval, "%H")))

最新更新