日付部分を破棄する一連のPOSIXctオブジェクトから時間を抽出するにはどうすればよいですか?
例えば、私は持っています:
times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979,
1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059,
1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct",
"POSIXt"))
これらの日付に対応します:
"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET"
"2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET"
"2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET"
"2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET"
"2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"
今、私はそれらの時間に測定されたパラメータのいくつかの値を持っています
val <- c(1.25343125e-05, 0.00022890575,
3.9269125e-05, 0.0002285681875,
4.26353125e-05, 5.982625e-05,
2.09575e-05, 0.0001516951251,
2.653125e-05, 0.0001021391875)
Valが測定された特定の日に関係なく、valとその日の時間をプロットしたいと思います。
それを可能にする特定の機能はありますか?
strftime
を使用して、日時を任意の文字形式に変換できます。
> t <- strftime(times, format="%H:%M:%S")
> t
[1] "02:06:49" "03:37:07" "00:22:45" "00:24:35" "03:09:57" "03:10:41"
[7] "05:05:57" "07:39:39" "06:47:56" "07:56:36"
しかし、データをプロットしたいので、それはあまり役に立ちません。回避策の1つは、時間から日付要素を取り除き、すべての時間に同じ日付を追加することです。
> xx <- as.POSIXct(t, format="%H:%M:%S")
> xx
[1] "2012-03-23 02:06:49 GMT" "2012-03-23 03:37:07 GMT"
[3] "2012-03-23 00:22:45 GMT" "2012-03-23 00:24:35 GMT"
[5] "2012-03-23 03:09:57 GMT" "2012-03-23 03:10:41 GMT"
[7] "2012-03-23 05:05:57 GMT" "2012-03-23 07:39:39 GMT"
[9] "2012-03-23 06:47:56 GMT" "2012-03-23 07:56:36 GMT"
これで、これらのdatetime
オブジェクトをプロットで使用できます。
plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")
さらにヘルプが必要な場合は、?DateTimeClasses
トリックを示す以前の回答がありました。本質的に:
既存のすべてのプロット関数を利用するには、POSIXct
タイプを保持する必要があります
数日間の価値を1つのプロットで「オーバーレイ」し、日内変動を強調したい場合は、最高のトリックもあります...
同じ日を課します(また、必要に応じて月と年を課しますが、ここではそうではありません)
これは、POSIXlt
表現のときに月と月のコンポーネントをオーバーライドするか、異なる日の間の0:00:00を基準にして「デルタ」をオフセットすることで実行できます。
したがって、times
とval
を使用すると便利です。
## impose month and day based on first obs
ntimes <- as.POSIXlt(times) # convert to 'POSIX list type'
ntimes$mday <- ntimes[1]$mday # and $mon if it differs too
ntimes <- as.POSIXct(ntimes) # convert back
par(mfrow=c(2,1))
plot(times,val) # old times
plot(ntimes,val) # new times
これにより、元のタイムスケールと修正されたタイムスケールが対照的になります。
data.table
パッケージには関数 'as.ITime
'、これは効率的に以下を使用することができます:
library(data.table)
x <- "2012-03-07 03:06:49 CET"
as.IDate(x) # Output is "2012-03-07"
as.ITime(x) # Output is "03:06:49"
多くのソリューションが提供されていますが、パッケージchronを使用するこのソリューションは見ていません。
hours = times(strftime(times, format="%T"))
plot(val~hours)
(申し訳ありませんが、画像を投稿する権利はありません。自分で画像をプロットする必要があります)
私は正確に時刻を扱うものを見つけることができないので、package:lubridateのいくつかの関数を使用し、seconds-since-midnightで作業するだけです。
require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)
次に、軸コードのいくつかを見て、軸に適切にラベルを付ける方法を見つけたいと思うかもしれません。
time_t
GMTの深夜0時の値は、常に86400
(24 * 3600
)。そのため、GMTの午前0時からGMTまでの値はtime %% 86400
。
GMTの時間は(time %% 86400) / 3600
およびこれは、プロットのx軸として使用できます。
plot((as.numeric(times) %% 86400)/3600, val)
タイムゾーンに合わせて調整するには、タイムゾーンがGMTより進んでいる秒数を加算して、モジュラスを取る前に時間を調整します。たとえば、米国中部夏時間(CDT)はGMTから5時間遅れています。 CDTの時間に対してプロットするには、次の式が使用されます。
plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)