【问题标题】:Convert dd/mm/yyyy HH:MM to POSIXct class [closed]将 dd/mm/yyyy HH:MM 转换为 POSIXct 类 [关闭]
【发布时间】:2017-02-21 15:09:55
【问题描述】:

我在 R 中使用 sub 函数时遇到问题,我必须从一个字符创建一个 POSIXct 向量,我决定在使用 as.POSIXct 阅读它之前将其符合 ISO 标准。

我的字符串如下所示:

"01/01/2015 08:00"

我想要的字符串如下所示:

"2015-01-01 08:00"

这是我使用的代码:

s= gsub('^([0-9]{2})/([0-9]{2})/([0-9]{4})', '\3-\2-\1', s)

我得到的结果是这样的:

"\003-\002-\001 08:00"

当然,我可以简单地使用as.POSIXct 的参数来读取向量,但是我怎么可能得到这样的结果呢?我无法理解这一点。

【问题讨论】:

  • 你需要在替换部分中双重转义:gsub('^([0-9]{2})/([0-9]{2})/([0-9]{4})', '\\3-\\2-\\1', s) - 但除了这个“错字”更正之外,我同意在你的情况下最好使用as.POSIXct
  • 使用as.POSIXct的参数比摆弄正则表达式要干净得多,恕我直言。
  • 确实如此,但我已经习惯了正则表达式,所以我的第一个方法是使用它们,我不喜欢我不能在 R 上使用它们。我的问题实际上是全部关于字符串替换

标签: r


【解决方案1】:

我们可以使用lubridate 转换为 DateTime 类

library(lubridate)
dmy_hm(str1)
#[1] "2015-01-01 08:00:00 UTC"

或者这可以通过@DavidArenburg 评论的as.POSIXct 来完成

 as.POSIXct(str1, format = "%d/%m/%Y %H:%M")

如果需要特定的format,请使用format

format(dmy_hm(str1), "%Y-%m-%d %H:%M")
#[1] "2015-01-01 08:00"

如果我们想要正则表达式的方式(但不建议在日期时间上使用正则表达式),我们可以将字符捕获为一组(第一个捕获组中的前两个字符,后跟一个字符,接下来的两个字符在第二个捕获组,留下下一个字符,第三个捕获组中的最后四个字符。在替换中,我们可以更改反向引用顺序以获得预期的输出

sub("(.{2}).(.{2}).(.{4})", "\\3-\\2-\\1", str1)
#[1] "2015-01-01 08:00"

数据

str1 <- "01/01/2015 08:00"

【讨论】:

  • OP 说“我必须创建一个 POSIXct 向量”所以为什么不直接使用as.POSIXct(str1, format = "%d/%m/%Y %H:%M")
  • 双反斜杠工作正常。谢谢
  • 正如@DavidArenburg 所说,为什么要使用外部库,而as.POSIXct 正是需要的?
  • @Rodrigo 我想我读错了这个问题,因为我认为 OP 想要专门使用正则表达式并且还想要某种格式的 t
【解决方案2】:

永远不要在日期上使用正则表达式。为此,我们有适当的类型,这是有原因的。

我喜欢 anytime 封装(并编写它),因为它可以转换(正常)输入不需要格式字符串

R> library(anytime)
R> anytime("01/01/2015 08:00")
[1] "2015-01-01 08:00:00 CST"
R> 

如果您不想手动操作,它还有一些有用的格式助手。但正如 David Arenburg 所指出的,所有这些都可以通过基本 R 来完成:

R>rfc2822( anytime("01/01/2015 08:00") )
[1] "Thu, 01 Jan 2015 08:00:00.000000 -0600"
R> rfc3339( anytime("01/01/2015 08:00") )
[1] "2015-01-01T08:00:00.000000-0600"
R> iso8601( anytime("01/01/2015 08:00") )
[1] "2015-01-01 08:00:00"
R> 

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多