我有一个如下所示的数据框:
data <- data.frame(PROG_START = c("Tuesday, October 1, 2019", "1682294400"))
> print(data)
PROG_START
1 Tuesday, October 1, 2019
2 1682294400
如您所见,PROG_START 列具有两种不同格式的日期(UTX 时间戳和星期、月、日、年)。我想标准化此列中的值,以便所有日期的格式都是日-月-年。
我查看了 Stack,但没有成功地找到解决方案。我确实找到了一篇有用的帖子,促使我开发了以下内容:
data1 <- data %>%
mutate(Dates = case_when(str_detect(PROG_START, '\\d{10}\\.\\d{3}') ~ PROG_START, TRUE ~ NA_character_ )) %>%
mutate(Dates = as.POSIXct(as.numeric(PROG_START), origin = '1970-01-01', tz = 'UTC')) %>%
mutate(PROG_START = anytime(PROG_START)) %>% mutate(PROG_START = coalesce(PROG_START, Dates)) %>% select(-Dates)
这成功地转换了大部分 UTX 时间戳,但是,少数的年份是错误的。例如,1682294400 被归因于 1682 年而不是 2023 年。它还将所有其他格式的日期(即 2019 年 10 月 1 日星期二)转换为 NA。
然后我将上面的代码更新为:
data1 <- data %>%
mutate(PROG_START = case_when(
str_detect(PROG_START, '\\d{10}\\.\\d{3}') ~ as.POSIXct(as.numeric(PROG_START), origin = '1970-01-01', tz = 'UTC'),
TRUE ~ dmy(PROG_START)
)) %>%
mutate(PROG_START = format(PROG_START, "%d-%m-%Y"))
然而,这一切都变成了NA。目前不知道如何进行。我很感激你的帮助!谢谢!
我最近不得不做类似的事情,这里有一个解决方案,用于检查非 NA 且不包含逗号的值,因此它应该只影响 UTX 时间戳。
由于该列是字符,我们需要将值转换为int,以便能够转换为日期。
肯定有一个性能更好的解决方案,但它确实有效。
for (i in 1:nrow(data)) {
if (!is.na(data$PROG_START[i]) && !grepl(",", data$PROG_START[i])) {
data$PROG_START[i] <- format(as.Date(as.integer(data$PROG_START[i]), origin = "1970-01-01"), "%A, %B %d, %Y")
}
}