POSIXctからの時間の抽出


85

日付部分を破棄する一連の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と時刻をプロットしたいと思います。

それを可能にする特定の機能はありますか?

回答:


117

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


16

トリックを示した以前の回答がありました。本質的に:

  • POSIXct既存のすべてのプロット関数を利用するには、型を保持する必要があります

  • 1つのプロットに数日分の「オーバーレイ」を行い、1日の変動を強調したい場合は、最善の策も...

  • 同じ日を課します(必要に応じて月や年も課しますが、ここではそうではありません)

これは、POSIXlt表現時に日と月のコンポーネントをオーバーライドするか、異なる日の0:00:00を基準にして「デルタ」をオフセットすることで実行できます。

ですから、あなたが提供してくれたものtimesval同じように:

## 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

これは、元の時間スケールと変更された時間スケールを対比させて生成します。

ここに画像の説明を入力してください


10

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"

4

正確に時刻を処理するものが見つからないため、package:lubridateのいくつかの関数を使用して、seconds-since-midnight:を使用します。

require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)

次に、軸コードのいくつかを調べて、軸に適切にラベルを付ける方法を理解することをお勧めします。


ニース、私は見なければならないでしょうlubridate、面白いパッケージのようです。
nico 2012年

4

time_tグリニッジ標準時の午前0時の値は、常に8640024 * 3600)で割り切れます。したがって、グリニッジ標準時の深夜からの秒数の値は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)

4

多くのソリューションが提供されていますが、パッケージchronを使用するこれは見たことがありません。

hours = times(strftime(times, format="%T"))
plot(val~hours)

(申し訳ありませんが、私は画像を投稿する資格がありません。自分でプロットする必要があります)


1

これは、POSIXctオブジェクトからhh:mm :: ss.sssssを抽出するための整頓されたメソッドを探している人のためのアップデートです。タイムゾーンは出力に含まれないことに注意してください。

library(hms)
as_hms(times)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.