【问题标题】:Convert HH:MM:SS AM/PM string to time将 HH:MM:SS AM/PM 字符串转换为时间
【发布时间】:2017-01-16 21:53:42
【问题描述】:

我需要以“1:36:22 PM”之类的字符格式解析时间。

我尝试了as.POSIXctstrptime 的各种排列,但就是无法到达那里。例如,这未能体现 PM 的重要性:

t <- "1:36:22 PM"
as.POSIXct(t, format = "%H:%M:%S")
# [1] "2016-09-08 01:36:22 BST"

这失败了:

strptime(t, "%H:%M:%S")
# [1] NA

奇怪的是,出于我无法理解的原因,从输入中删除秒数可能会起作用:

t <- "1:30:00 PM"
strptime(t, "%I:%M %p")
# [1] NA
 
t <- "1:30 PM"
strptime(t, "%I:%M %p")
# [1] "2016-09-08 13:30:00 BST"

我想要的只是让它工作:

t <- "1:30:00 PM"
SOME COMMAND HERE HERE
# [1] "13:30:00"

有什么想法吗?

【问题讨论】:

  • format(strptime(t, "%I:%M:%S %p"), "%H:%M:%S")
  • hms::as.hms(lubridate::parse_date_time("1:30:00 PM", "IMS p"))

标签: r time


【解决方案1】:

使用转换规范%I%p。请参阅?strptime中的详细信息部分:

%I 小时,十进制数 (01–12)。>

%p 区域设置中的 AM/PM 指示符。与%I 结合使用,not%H 结合使用。

strptime(t, "%I:%M:%S %p")

【讨论】:

  • 这个答案出现在低质量审查队列中,大概是因为您没有提供任何代码解释。如果此代码回答了问题,请考虑在答案中添加一些解释代码的文本。这样一来,您就更有可能获得更多支持,并帮助提问者学习新知识。
  • ...另外,您的答案中似乎有%l(小写L)而不是%I(大写I)
【解决方案2】:

您是否尝试过使用 lubridate 包?它可以使用“parse_date_time”函数中的%p指标来处理AM/PM。

library(lubridate)
t <- "1:36:22 PM"
parse_date_time(t, '%I:%M:%S %p')
[1] "2016-09-08 13:36:22 UTC"

来自lubridate documentation

%I: 小时数为十进制数(01-12 或 1-12)。

%M: 分钟为十进制数(00-59 或 0-59)。

%S: 秒为十进制数(00-61 或 0-61)。

%P: 区域设置中的 AM/PM 指示符。与 I 结合使用,而不与 H 结合使用。在某些语言环境中为空字符串。

【讨论】:

  • 这些缩写是基本 R 的一部分。请参阅strptime 的文档以查看所有可用的日期时间缩写。
  • parse_date_time 你不需要% 符号; it ignores them anyway.
  • 使用来自lubridate的命令ymd_hms,你甚至不需要指定格式,只要你输入一个合理的日期时间值。它会自动从 AM/PM 转换为 24 小时制。
猜你喜欢
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2011-12-29
相关资源
最近更新 更多