将整数转换为ITime?

时间:2017-05-02 05:53:27

标签: r data.table

我正在考虑使用新的data.table日期和时间格式。由于ITime被存储为引擎盖下的整数(自午夜起的秒数):

x <- as.ITime( "10:25:00" )
i <- as.integer( x )
i
[1] 37500

似乎应该很容易将整数(假设它小于24 * 60 * 60)转换为ITime,但我不知道如何:

as.ITime( i )
Error in as.POSIXlt.numeric(x, ...) : 'origin' must be supplied

as( i, "ITime" )
Error in as(i, "ITime") : 
  no method or default for coercing “integer” to “ITime”

提供一个原点(我收集传递给as.POSIX...)确实有帮助,但即使这样,如果你还指定tz为“UTC”,它只会给出正确的值(对于我的语言环境) :

as.ITime( i, origin = "1970-01-01 00:00:00" )
[1] "20:25:00"

as.ITime( i, origin = "1970-01-01 00:00:00", tz = "UTC" )
[1] "10:25:00"

# note that the date seems necessary but irrelevant here
as.ITime( i, origin = "2000-01-01 00:00:00", tz = "UTC" )
[1] "10:25:00"

我所谈论的内容类似于我有时与chron::times使用的内容:

x <- chron::times( "10:25:00" )

n <- as.numeric( x )
n
[1] 0.4340278

chron::times( n )
[1] 10:25:00

ITime类是否有类似的(除了使用整数而不是数字/双精度/浮点数)方法?

注意我发现IDateDate等有同样的“原始需求”问题,但这对我来说更有意义,因为origin="1970-01-01"不是很少与使用“午夜”作为时间起源相比较的强大标准(我使用一些具有不同想法的数据源,将哪个日期称为“原点”)。

1 个答案:

答案 0 :(得分:5)

这有效:

library(data.table)
DT = data.table(int = 37500L)
DT[, setattr(int, "class", "ITime")]

#         int
# 1: 10:25:00

int = 37500L
setattr(int, "class", "ITime")

# "10:25:00"