我有一个带有一列时间戳“2000-01-01 12:00:00.123456”的csv文件。在数据表中处理它的推荐方法是什么?我需要处理分组,匹配/滚动连接与另一个表中的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岁了,我想知道现在是否有更好的方法?
答案 0 :(得分:8)
IDateTime
需要POSIXct
类对象才能正常工作(它似乎也适用于factor
转换,不确定原因)。我同意它没有很好地记录,并且可能值得在GH上打开关于文档的FR / PR - 但是有一个关于IDateTime
vignette的开放队列。关于允许它与character
类合作,已经有FR。
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
如果您想避免意外行为,请注意tz
中的as.POSIXct
参数
无论如何,错误实际上是由调用ITime
的{{1}}的打印方法引起的,请参阅here和here
例如,如果您将运行format.ITime
,那么不会会产生错误,但res <- IDateTime("2015-09-29 08:22:00")
由于{{3}中的错误转换(我相信)将为res
(格式仅为NA
)。对我来说这似乎是一个错误,我仍然不确定"%H:%M:%OS"
类在factor
中没有factor
方法时是如何正常工作的。可能是由于其methods(as.ITime)
内部存储模式调用了另一种相关方法。
答案 1 :(得分:2)
根据时间字段所需的精确度,您可能需要使用POSIXct
代替IDateTime
。
存储在源文件中的时间戳格式可以通过format(Sys.time(), "%Y-%m-%d %H:%M:%OS6")
在R中再现
使用IDateTime
时,您将丢失亚秒,您可以使用ITime
来查看它是否符合您的需要。
如果您坚持POSIXct
,那么您应该了解?setNumericRounding
函数,这可能有时很重要,因为它会影响排序和加入POSIXct
的基础数值数据类型。< / p>