如何使用 R 中的两种不同类型的日期格式将字符转换为日期?

How to convert character to date with two different types of date formats in R?

我有一个超过 200 万个 obs 的庞大数据集,所有列的 类 都是字符类型。我需要将其中一个转换成日期格式dd/mm/yyyy,但是日期是这样写的:

dates <- c("2022-04-08", "26/01/2021", "14/07/2021", "2021-12-27")

我已经尝试过在其他帖子中找到的一些解释,但其中 none 似乎对我有用。一组日期总是变成 NA。

您可以这样做:

format_ymd  <- as.Date(dates, format = "%Y-%m-%d")
format_dmy  <- as.Date(dates, format = "%d/%m/%Y")
as.Date(ifelse(is.na(format_ymd), format_dmy, format_ymd), origin = "1970-01-01")
# [1] "2022-04-08" "2021-01-26" "2021-07-14" "2021-12-27"

1) Base R 使用 as.Date 和显示的格式向量。没有使用包。

as.Date(dates, format = ifelse(grepl("/", dates), "%d/%m/%Y", "%Y-%m-%d"))
## [1] "2022-04-08" "2021-01-26" "2021-07-14" "2021-12-27"

2) Base R - 2 另一种方法是将 dd/mm/yyyy 转换为 yyyy-mm-dd,然后只使用 as.Date。没有使用包。

as.Date(sub("(..)/(..)/(....)", "\3-\2-\1", dates))
## [1] "2022-04-08" "2021-01-26" "2021-07-14" "2021-12-27"

3) lubridate 使用 lubridate 使用 parse_date_time 然后将其转换为 Date class.

library(lubridate)

as.Date(parse_date_time(dates, c("ymd", "dmy")))
## [1] "2022-04-08" "2021-01-26" "2021-07-14" "2021-12-27"

4) coalesce我们可以在dplyr中使用coalesce。它采用它找到的第一个 non-NA。

library(dplyr)

coalesce(as.Date(dates), as.Date(dates, "%d/%m/%Y"))
## [1] "2022-04-08" "2021-01-26" "2021-07-14" "2021-12-27"

类似于 SamR 的方法

data.table::fifelse(
  grepl("^\d{4}", dates),
  as.Date(dates,"%Y-%m-%d"),
  as.Date(dates, "%d/%m/%Y")
)

使用时钟包,您可以向 date_parse() 提供多个 format,它会按顺序尝试它们。这对于格式截然不同的情况非常有用。

library(clock)

dates <- c("2022-04-08", "26/01/2021", "14/07/2021", "2021-12-27")

# Tries each `format` in order. Stops on first success.
date_parse(
  dates,
  format = c("%Y-%m-%d", "%d/%m/%Y")
)
#> [1] "2022-04-08" "2021-01-26" "2021-07-14" "2021-12-27"

reprex package (v2.0.1)

于 2022-04-12 创建