2017-05-12 11 views
0

%H:%M:%S(class = factor)の形式で時間間隔をclass = difftimeに変換する必要があります。私は現在、これを行うにはas.difftime()を使用していますが、時間の値が> 231日以上経過すると、as.difftime()の問題が発生する

TimeElapsed_raw = as.factor(c("03:59:59", "21:00:00", "01:03:46", "44:00:00", "24:59:59")) 
TimeElapsed = as.difftime(as.character(TimeElapsed_raw), format = "%H:%M:%S") 
TimeElapsed 

Time differences in hours 
[1] 3.999722 21.000000 1.062778  NA  NA 

あるとき、それはNAを返します。私は、私は(as.difftimeでフォーマット文を含めるかどうか、同じ問題を抱えています):

as.difftime("65:01:17") 
Time difference of NA secs 

しかし、これは動作します:

as.difftime(65.1, units = "hours") 
Time difference of 65.1 hours 

私はまたlubridateのas.duration()関数を使用して試してみたが、それは計算値が無意味なようです。

as.duration(TimeElapsed_raw) 
[1] "2s" "3s" "1s" "5s" "4s" 

助けてください!

+2

数字でのみ動作します。私は自分のデータを ':'でcsvから読み込んでいるので、それを要素や文字としてしかフォーマットできません。値にas.numeric()を使用しようとすると、私にはNAが与えられます。 – pradlee

答えて

0

あなたが最初lubridateduration機能によって理解されているXH xMのXSにデータの形式を変更することができます:

x=gsub("(^\\d{2}):(\\d{2}):(\\d{2})$","\\1H \\2M \\3S",as.character(TimeElapsed_raw)) 
[1] "03H 59M 59S" "21H 00M 00S" "01H 03M 46S" "44H 00M 00S" "24H 59M 59S" 

をそしてdurationを適用します。

duration(x) 
[1] "14399s (~4 hours)"  "75661s (~21.02 hours)" "3826s (~1.06 hours)" 
[4] "158461s (~1.83 days)" "89999s (~1.04 days)" 

そうでない場合as.difftimeを使用すると、まずデータを時間、分、秒に分割し、それぞれを別々にフィードすることができますas.difftime:あなたはベクトルにリストを変換したい場合

v=lapply(strsplit(TimeElapsed_raw,":"),function(x) {as.difftime(as.numeric(x[1]),units="hours")+as.difftime(as.numeric(x[2]),units="mins")+as.difftime(as.numeric(x[3]),units="secs")}) 

[[1]] 
Time difference of 14399 secs 

[[2]] 
Time difference of 75600 secs 

[[3]] 
Time difference of 3826 secs 

[[4]] 
Time difference of 158400 secs 

[[5]] 
Time difference of 89999 secs 

unlistクラスを失うと、その後difftimeにそれを再変換してください。

v=as.difftime(unlist(v),unit="secs") 
+0

時間を秒単位ではなく時間単位で出力したい場合はどうすればよいですか? unlist()ステップで単位を「時間」に変更するだけでは、値自体は同じままです。例えば。 lapply()ステップの "Time difference of 14399 secs"は "14399時間の時差"として保存されます。 – pradlee

+0

'unlist()'の後、 'v'は' numeric'と見なされるので、 'as.difftime()'を適用するときは、入力を秒単位で指定する必要があります。後で、 'difftime'オブジェクトの単位を時間単位に変更したい場合は、' units(v)= "hours" 'を実行してください。 – Lamia

関連する問題