我正在使用
read_excel
将数据从 Excel 读入 R。其中一列 date_time
具有混合格式,并作为字符向量读入。这是行的示例。
date_time <- c(
45144.4762962963,
45144.475138888891,
"14-08-2023 10:38:54 AM",
"14-08-2023 10:37:03 AM",
"24-05-2023 9:29:44 AM",
"24-05-2023 9:27:18 AM",
45113.462395833332,
45113.461261574077,
"15-05-2023 1:47:12 PM",
44988.399664351855
)
data <- tibble(date_time)
混合格式的原因似乎是,当数据最初解析到Excel表格时,它期望的格式是mm-dd-yyyy hh:mm:ss,但实际数据是dd-mm (切换)。结果是,如果第一个数字大于 12,则会将其解析为 Excel 作为文本变量(例如
data
的第 3 行)。然而,当日期不明确时,它会以 Excel 的日期格式进行解析,并且日期和月份错误地切换(例如 data
的第 1 行应该是 08-06-2023 11:25:52 AM)。
如何将其转换为具有正确日期的一致
dttm
对象?我想我可以通过编辑我正在读入的 Excel 文件来做到这一点,但由于这将是一个持续存在的问题,我想找到一种在 R 中做到这一点的方法。
可能有一种更简洁的方法来做到这一点,但是下面的代码可以完成这项工作 用于您的格式组合。
首先使用
parse_date_time
转换简单的,然后将数字转换为日期时间并以正确的顺序读取日期。
data <- tibble(date_time) |>
mutate(
new_date_time1 = parse_date_time(
date_time,
orders = c("%d-%m-%Y %I:%M:%S %p"),
tz = "UTC"
),
new_date_time2 = parse_date_time(
as.character(
as.POSIXct(
as.Date(
as.numeric(date_time),
origin =
"1899-12-30")
)),
orders = c("%Y-%d-%m %H:%M:%S"))) |>
transmute(fixed_date_time = if_else(is.na(new_date_time1),
new_date_time2,
new_date_time1))
# A tibble: 10 × 1
# fixed_date_time
# <dttm>
# 1 2023-06-08 11:25:52
# 2 2023-06-08 11:24:12
# 3 2023-08-14 10:38:54
# 4 2023-08-14 10:37:03
# 5 2023-05-24 09:29:44
# 6 2023-05-24 09:27:18
# 7 2023-06-07 11:05:50
# 8 2023-06-07 11:04:13
# 9 2023-05-15 13:47:12
# 10 2023-03-03 09:35:31