我正在考虑使用新的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
类是否有类似的(除了使用整数而不是数字/双精度/浮点数)方法?
注意我发现IDate
,Date
等有同样的“原始需求”问题,但这对我来说更有意义,因为origin="1970-01-01"
不是很少与使用“午夜”作为时间起源相比较的强大标准(我使用一些具有不同想法的数据源,将哪个日期称为“原点”)。
答案 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"