标准化列中的不同时间格式

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

我有一个如下所示的数据框:

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。目前不知道如何进行。我很感激你的帮助!谢谢!

r date data-cleaning lubridate utc
1个回答
0
投票

我最近不得不做类似的事情,这里有一个解决方案,用于检查非 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")
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.