【问题标题】:R data table recommended way to deal with date timeR数据表推荐的日期时间处理方式
【发布时间】:2015-10-11 10:37:15
【问题描述】:

我有一个 csv 文件,其中有一列时间戳“2000-01-01 12:00:00.123456”。在数据表中处理它的推荐方法是什么?我需要处理分组、与另一个表中的 IDate 列匹配/滚动连接、时间序列绘图等。

IDateTime("2000-01-01 12:00:00.123456")

Error in if (any(neg)) res[neg] = paste("-", res[neg], sep = "") :
missing value where TRUE/FALSE needed

我在可能的duplicate 问题中看到了这个答案,其中 Matthew 建议手动将日期转换为整数。但那已经 3 岁了,我想知道现在是否有更好的方法?

【问题讨论】:

  • 你需要传递一个POSIXct对象,试试IDateTime(as.POSIXct("2000-01-01 12:00:00.123456"))。对于特殊情况,您可能需要通过 tz 参数指定时区。
  • 谢谢。您能否将其放入答案中以便我接受?

标签: r datetime data.table


【解决方案1】:

IDateTime 需要POSIXct 类对象才能正常工作(它似乎也可以通过factor 转换正常工作,不知道为什么)。我同意它的文档记录不是很好,也许值得在 GH 上打开一个关于文档的 FR/PR - 尽管有一个关于 IDateTime vignette 的开放队列。并且已经有一个 FR 允许它与 character 类一起使用。

IDateTime(as.POSIXct("2000-01-01 12:00:00.123456"))
#         idate    itime
# 1: 2000-01-01 12:00:00
## IDateTime(factor("2000-01-01 12:00:00.123456")) ## will also work

如果要避免意外行为,请注意as.POSIXct 中的tz 参数


不管怎样,看起来错误实际上是由调用format.ITimeITime的打印方法引起的,请参阅herehere 例如,如果您将运行res <- IDateTime("2015-09-29 08:22:00"),这将不会产生错误,尽管res 将是NA 由于here 中的错误转换(我相信)(格式仅为@ 987654339@)。这对我来说似乎是一个错误,我仍然不确定为什么 factor 类在 methods(as.ITime) 中没有 factor 方法时可以正常工作。可能是因为它的integer内部存储模式调用了另一个相关的方法。

【讨论】:

    【解决方案2】:

    根据您的时间字段所需的精度,您可能需要使用POSIXct 而不是IDateTime
    format(Sys.time(), "%Y-%m-%d %H:%M:%OS6") 可以在 R 中复制存储在源文件中的时间戳格式。
    使用IDateTime 时,您将失去亚秒,您可以使用ITime 看看它是否符合您的需要。
    如果您坚持使用POSIXct,那么您应该注意?setNumericRounding 函数,它有时可能很重要,因为它会影响POSIXct 的基础数字数据类型的排序和连接。

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 2010-10-09
      • 2017-01-01
      • 1970-01-01
      • 2020-12-20
      • 2013-09-01
      • 2023-04-10
      • 2011-04-03
      • 2014-05-04
      相关资源
      最近更新 更多