web-dev-qa-db-ja.com

日付時刻をフォーマットされた時刻文字列に変換します

なぜ動かないのかわかりません。これが私のコードです:

> t <- hms("14:11:49")
> t
[1] "14H 11M 49S"
t <- t + minutes(3)
> format(t, format="%H:%M:%S")
[1] "14H 14M 49S"
# Expected output: "14:14:49"

更新:

現在私はこの解決策を見つけましたが、もっとエレガントな解決策があることを願っています:

t <- hms("14:11:49") # example period object
sprintf("%s:%s:%s", hour(t), minute(t), second(t))
#"14:11:49"
18
biocyberman

hmsに変換して、最初の文字列形式に戻す必要がある理由がわかりません。多分 parse_date_time関数はあなたが必要とするものです:

library(lubridate)
myTime <- "14:11:49"
hms(myTime)
#"14H 11M 49S"

POSIXct_myTime <- parse_date_time(myTime,"hms")
format(POSIXct_myTime, format="%H:%M:%S")
#"14:11:49"

編集:pasteを使用できます:

t <- hms("14:11:49")
t
#[1] "14H 11M 49S"
t <- t + minutes(3)
t
#[1] "14H 14M 49S"

paste(hour(t),minute(t),second(t),sep=":")
#[1] "14:14:49"

ベンチマーク出力:

op <- microbenchmark(
  Use_paste=paste(hour(t),minute(t),second(t),sep=":"),
  Use_sprintf=sprintf("%s:%s:%s", hour(t), minute(t), second(t)),
  times=1000000L)
op

# Unit: microseconds
# expr    min     lq median     uq      max neval
# Use_paste 28.072 31.695 32.601 33.506 44253.42 1e+06
# Use_sprintf 29.582 33.807 34.412 35.619 44367.52 1e+0
19
zx8754

問題は、class(t)が「期間」であり、format.Period()関数に_format=_のパラメーターがないことです。 tオブジェクトは、format()で使用できる標準のPOSIXtスタイルオブジェクトではありません。 format.POSIXct()関数とformat.POSIXlt()関数のみがそのように動作します。

したがって、おそらく最も簡単なことは、PeriodクラスをPOSIXctに変換するヘルパー関数を定義することです。これは次の方法で行うことができます。

_as.POSIXct.Period <- function(x, start=today()) {
    X<-as.interval(x, start); 
    [email protected]+X@start
}
_

POSIXctは日付/時刻の値であり、単なる時刻の値ではないことに注意してください。したがって、デフォルトでは、それが今日午前0時に開始されたと想定しています。しかし、私たちはあなたが望む方法でフォーマットを使うことができます

_format(as.POSIXct(t), format="%H:%M:%S")
# [1] "14:11:49"
_

私はlubridateのエキスパートではないことを認めなければならないので、明らかな機能を見落としているかもしれませんが、lubridateクラスを「きれいな」フォーマットにフォーマットするためのオプションは非常に限られているようです。

2
MrFlick

提案されたソリューションは、先行ゼロを出力しません。次の解決策はより洗練されているようです:

> t <- hms("14:01:49") + minutes(3)
> sprintf("%s:%s:%s", hour(t), minute(t), second(t))
[1] "14:4:49" # looking weird
> format(Sys.Date() + t, "%H:%M:%S")
[1] "14:04:49" # looking better
0
shosaco