如果列作为 R 中的字符导入,则将列转换为日期/时间

问题描述 投票:0回答:1

我正在编写一个脚本来自动化获取 Excel 数据的过程。正在处理的电子表格将始终具有相同的列数(总共 58 个)和相同的字段名称。有 6 列包含这种格式的日期和时间

YYYY-MM-DD HH:MM:SS
,它在 Excel 中以正确的格式显示。但是,我注意到在导入 R 期间,某些列会将日期/时间列导入为十进制时间,并且并不总是相同的。列类型变为
character
列。在下面的示例中,time2 是作为
character
导入的列,但在下次导入时它可能是
time3
time4
或两者。

library(lubridate)
library(tidyverse)

time1 <- ymd_hms(c("2024-03-21 10:55:00", "2024-01-22 04:37:02", "2024-5-3 23:43:09" ))
time2 <- as.character(c("44651.422222222223", "44652.873611111114", "44654.685416666667" ))
time3 <- ymd_hms(c("2024-03-01 12:15:19", "2024-1-18 01:07:20", "2024-5-6 13:33:29" ))
time4 <- ymd_hms(c("2024-11-17 08:05:26", "2024-09-12 10:13:11", "2024-4-3 12:53:30" ))
time5 <- ymd_hms(c("2024-09-19 01:45:42", "2024-11-26 06:00:20", "2024-5-13 22:03:05" ))
time6 <- ymd_hms(c("2024-05-29 03:25:37", "2024-08-02 08:05:28", "2024-12-23 03:13:6" ))
col1 <- c("blah", "blah", "blah")
col2 <- c("blah", "blah", "blah")
col3 <- c("blah", "blah", "blah")

df <- data.frame(time1, time2, time3, time4, time5, time6, col1, col2, col3)

因为我不知道哪一列将作为字符导入,所以我想写一些内容以确保如果它确实作为字符导入,它将被转换为日期/时间。我的计划是隔离字符日期/时间列,转换它们,然后重新加入数据框。

times <- c("time1", "time2", "time3", "time4", "time5", "time6")
char_col <- df %>%  select(matches(times)) %>% select(where(is.character))
char_col2 <- ymd_hms(char_col)

这是错误:

Warning message:
All formats failed to parse. No formats found. 

我是 R 的初学者,所以我不太明白我哪里出了问题。关于如何解决这个问题有什么建议吗?

r
1个回答
0
投票
try_fn <- function(x){
  tryCatch(as.POSIXct(as.Date(as.numeric(x), origin = "1900-01-01")),
         warning = \(y)eval(y$call[[2]][[2]]))
}
df %>%
  mutate(across(where(is.character), try_fn))
                time1               time2               time3               time4               time5               time6 col1 col2 col3
1 2024-03-21 10:55:00 2022-04-02 10:08:00 2024-03-01 12:15:19 2024-11-17 08:05:26 2024-09-19 01:45:42 2024-05-29 03:25:37 blah blah blah
2 2024-01-22 04:37:02 2022-04-03 20:58:00 2024-01-18 01:07:20 2024-09-12 10:13:11 2024-11-26 06:00:20 2024-08-02 08:05:28 blah blah blah
3 2024-05-03 23:43:09 2022-04-05 16:27:00 2024-05-06 13:33:29 2024-04-03 12:53:30 2024-05-13 22:03:05 2024-12-23 03:13:06 blah blah blah
© www.soinside.com 2019 - 2024. All rights reserved.