如何使用 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 创建
我有一个超过 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 创建