2017-05-02 7 views
4

新しいdata.tableの日付と時刻の形式を使用しています。 ITime以来フード(午前0時からの秒数)の下で整数として格納されます。整数をITimeに変換しますか?

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

ITimeに(それは24 * 60 * 60未満だと仮定して)整数に変換するのに十分な簡単なはずのように思えあなたも指定した場合

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"として「真夜中」を使用した場合と比較して堅牢な標準のはるかに少ないですので、それは私に多くの意味があります時間の起源(私は、日付を「起源」と呼ぶべきである異なるアイデアを持ついくつかのデータソースを使用する)。

+2

SETATTRクラスはそれを行う必要があります。 – Frank

+0

本当にありがとう、フランク!もしあなたが望むなら、あなたのコメントを答えに変えてください。私はそれを受け入れます。 – rosscova

+0

あなたは 'setattr'でどのようにそれを達成しますか? –

答えて

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" 
+0

これは 'as.ITime'より速いのですか? – MichaelChirico

+0

@MichaelChirico 'as.ITime(37500L)#エラー'?それはベクトルに属性を追加するだけなので、かなり高速でなければならないので、より長いベクトルでより多くのコストをかけてはいけません。 – Frank

+1

heheは 'as.ITime(37500、origin = '1970-01-01 00:00:00'、tz = 'UTC')'を意味しました。 'setattr'を使う方が速いようですが、その一方で、私は「as.ITime」はそのような場合に可能な限りスピードアップされなければならないと感じている – MichaelChirico

関連する問題