在 R 中处理错误解析的日期时间数据

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

我正在使用

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 中做到这一点的方法。

r excel date lubridate
1个回答
0
投票

可能有一种更简洁的方法来做到这一点,但是下面的代码可以完成这项工作 用于您的格式组合。

首先使用

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
© www.soinside.com 2019 - 2024. All rights reserved.