【问题标题】:Parsing ISO8601 in R在 R 中解析 ISO8601
【发布时间】:2012-08-20 23:47:06
【问题描述】:

R 中是否存在将ISO8601 字符串解析为 POSIXt 对象的现有实现? ISO8601 规范允许以各种(非重叠)格式打印日期/时间,因此可能需要做一些正则表达式魔术来检测格式并将其提供给strptime

正确执行此操作实际上可能是quite challenging,但是检测最常见格式的东西已经非常有用。我很难想象我是第一个遇到这种情况的人,但我很难找到好的实现。

【问题讨论】:

  • 谷歌关闭谷歌代码搜索很糟糕。无论如何——R有它,乔希给了你一个指针。
  • Google 只给了我 lubridateisodate 以及一堆博客:/ 但我很高兴我问了这个问题,因为我即将开始自己实现它。
  • 试试rseek.org,它立即为我提供了“iso 8601”的相关点击。
  • 啊,谢谢。顺便说一句,我对xts 的实现并不过分兴奋。它仅适用于 ISO8601 wiki 页面上给出的 4 种示例格式中的一种。

标签: r date datetime posixct


【解决方案1】:

严格来说,你不能。我不需要知道任何关于 r 或 cran(甚至它们是什么)的知识来告诉你,因为我对 ISO 8601 的了解足以知道仅仅知道某事是 ISO 8601 不足以明确地知道它的含义通过它,尤其是在较短的形式中。

找出对方正在使用的 ISO 8601 的配置文件。如果他们不知道您在说什么,那么当您指出我在上一段中所说的内容时,您将帮他们一个忙。正如我曾经在别处写过的,

不幸的是,许多人在听到“ISO 8601”时会想到他们熟悉的特定配置文件,其他人知道使用 8601 是一件好事,但不熟悉实施细节。因此,规范或需求文档可能会提到 8601,但不会比这更明确。在这种情况下,重要的是寻求澄清,而不是假设您认为“ISO 8601”的格式是正确的。

所以,告诉他们“‘ISO 8601’不够具体,我需要确切地知道你在做什么,你对精度的限制是什么。” (可能您对 1582 年之前和可能在 0001 年之前的日期的政策是什么,您的闰秒政策,以及其他一些事情保持开放,但标准)

那么无论您处理什么都应该很容易:除了这一点模棱两可之外,这是一个非常简单的标准。它应该被视为定义日期格式的标准,而不仅仅是定义日期格式的标准。

【讨论】:

  • 有趣;我一直认为规范的设计是明确的,并且配置文件是相互排斥的。不幸的是,在我的案例中,数据是由多方提供的,而 ISO8601 是唯一达成一致的东西。也就是说,R 程序员通常需要务实。一些具有合理默认值的解析参数应该会让我们走得很远......
  • 120826 是今天有效的 8601 代码(甚至不是 Y2K 安全!)以及每天中午过去 8 分 26 秒(8601 确实警告不要进行一般交换)。同样,上面的 Jeroen 和 Dirk 都是有效的,但有些只有一个使用给定的函数。很有可能他们都在谈论日期或时间,并且都想要或都不想要时区信息,因此你应该能够提出一个涵盖其中很多的明确解析,但我会开始问:“you 8601 是什么意思?”。 hackcraft.net/web/datetime/#iso8601了解更多
  • 120826 根据 ISO 8601 是无效的。它曾经根据 ISO 8601:1988 有效,但该标准很久以前就被撤销了。
  • @MihaiCapotă 是的,到 2004 年它已经过时了。这并不是说超过 10 年的标准版本永远不会被使用。此外,20120826 仍然是有效形式这一事实仍然存在; ISO 8601 描述了一系列可能的格式,而不是一种格式,并且需要仔细检查(如果由您决定,请坚持使用扩展格式;基本格式很痛苦)仍然是必要的。
【解决方案2】:

请参阅 xts 包中的 .parseISO8601 以了解一种实现方式。我怀疑这会“开箱即用”,但它应该让您很好地了解如何实现您的特定需求。

【讨论】:

  • Hmz 我尝试的第一件事失败了:xts::.parseISO8601("2012-08-25T09:24Z")
  • 添加秒数(至少在这里)是强制性的:xts::.parseISO8601("2012-08-25T09:24:02") 有效。
  • 是的,末尾的 Z 表示不支持 UTC 时间。
【解决方案3】:

这看起来很有希望:http://cran.r-project.org/web/packages/parsedate

parsedate:识别和解析各种格式的日期,包括所有 ISO 8601 格式

自动解析日期,无需指定格式。 目前它包括 git 日期解析器。它还可以识别和 解析所有 ISO 8601 格式。

【讨论】:

  • 这似乎只处理日期,但 OP 要求提供日期时间。
【解决方案4】:
t <- strptime("2013-08-20T14:56:37", "%FT%T")

在大多数情况下对我来说都足够好。虽然它已经在几分之一秒内失败,并且不包括 Jon Hanna 提到的所有问题的解决方案。 (这使得使用时间数据类型变得异常困难。)

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多