【问题标题】:R convert string to timeR将字符串转换为时间
【发布时间】:2018-05-09 19:16:01
【问题描述】:

我想将字符串转换为时间。我有一个时间字段,其中字符串只有四个数字和一个字母(A 或 P)。数字之间没有冒号,表示这是一个时间。我想将 12 小时的字符串转换为 24 小时的时间,以便删除 A 和 P。

这是一个例子:

time = c("1110A", "1120P", "0420P", "0245P")

我正在寻找这样的时间课程:

Answer= c('11:10', '23:20', '16:20', '14:45')

任何帮助将不胜感激。

【问题讨论】:

  • 你希望它是一个实际的Date 类还是你希望它是一个角色?如果你希望它是一个Date,你还需要一个月/年标识符
  • 最后一个不应该是14:45而不是2:45吗?
  • 我希望能够相互减去两次。如果我可以用一个日期类来做到这一点,那就太好了。我意识到我在 Answer 变量中显示了字符。一旦达到这一点,我就可以轻松地转换它。
  • 该向量中的最后一项不符合该描述,因为它确实有一个冒号。这是故意的吗?

标签: r string time formatting


【解决方案1】:

您可以使用函数strptime 在对字符串进行少许更改后从字符串创建日期。

time <- c("1110A", "1120P", "0420P", "02:45P")
time <- gsub(":", "", time)
time <- strptime(x = paste0(time, "m"), format = "%I%M%p")

strptime 需要paste 才能使用我们提供的格式进行解析。 %I 是一个小时 (00-24),%M 是分钟,%p 是用于解析 AM/PM。

一旦它被解析为日期,您可以使用格式进行漂亮的打印,或者使用普通的运算符,如+-diff 等......

strptime 在解析日期时为您提供了很大的灵活性,但有时您必须在日期不是标准格式时尝试一些操作。

【讨论】:

  • %I 是十进制小时数 (01 - 12)
【解决方案2】:

在您的问题中,您说您希望能够减去这些时间。我认为将其转换为 POSIXct 对象最有意义。如果你想要一个特定的day/month/year,你需要将它附加到你的字符串中,如下所示,否则你不能指定一个,它会假定日期是今天:

date2 = as.POSIXct(paste0("01-01-2018 ", time, "m"), format = "%m-%d-%Y %I%M%p")

date2
#[1] "2018-01-01 11:10:00 EST" "2018-01-01 23:20:00 EST" "2018-01-01 16:20:00 EST" "2018-01-01 14:45:00 EST"

【讨论】:

    【解决方案3】:

    我们也可以使用lubridate函数解析paste日期后的格式

    library(lubridate)
    library(glue)
    ymd_hm(glue("2018-01-01 {time}M"))
    #[1] "2018-01-01 11:10:00 UTC" "2018-01-01 23:20:00 UTC"
    #[3] "2018-01-01 16:20:00 UTC" "2018-01-01 14:45:00 UTC"
    

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2022-10-17
      • 2012-02-03
      相关资源
      最近更新 更多