66

私が次のものを持っているとしましょうdata.frame foo

           start.time duration
1 2012-02-06 15:47:00      1
2 2012-02-06 15:02:00      2
3 2012-02-22 10:08:00      3
4 2012-02-22 09:32:00      4
5 2012-03-21 13:47:00      5

そしてclass(foo$start.time)戻ります

[1] "POSIXct" "POSIXt" 

foo$durationvのプロットを作成したいと思いますfoo$start.time。私のシナリオでは、1年の実際の日ではなく、時刻のみに関心があります。POSIXctベクトルのクラスから時刻を時間:秒として抽出するにはどうすればよいですか?

4

5 に答える 5

57

これは良い質問で、R で日付を処理する際の難しさの一部を浮き彫りにしています。lubridate パッケージは非常に便利なので、以下に 2 つのアプローチを示します。

元の投稿のデータフレーム (の最初の 2 行) を再作成します。

foo <- data.frame(start.time = c("2012-02-06 15:47:00", 
                                 "2012-02-06 15:02:00",
                                 "2012-02-22 10:08:00"),
                  duration   = c(1,2,3))

POSIXct および POSIXt クラスに変換します (これを行うには 2 つの方法があります)

# using base::strptime
t.str <- strptime(foo$start.time, "%Y-%m-%d %H:%M:%S")

# using lubridate::ymd_hms
library(lubridate)
t.lub <- ymd_hms(foo$start.time)

ここで、時間を10進数で抽出します

# using base::format
h.str <- as.numeric(format(t.str, "%H")) +
               as.numeric(format(t.str, "%M"))/60

# using lubridate::hour and lubridate::minute
h.lub <- hour(t.lub) + minute(t.lub)/60

これらのアプローチが等しいことを示します。

identical(h.str, h.lub)

次に、上記のアプローチのいずれかを選択して、10 進数の時間を に割り当てますfoo$hr

foo$hr <- h.str

# If you prefer, the choice can be made at random:
foo$hr <- if(runif(1) > 0.5){ h.str } else { h.lub }

次に、ggplot2 パッケージを使用してプロットします。

library(ggplot2)
qplot(foo$hr, foo$duration) + 
             scale_x_datetime(labels = "%S:00")
于 2012-05-22T18:42:19.663 に答える
18

ベースRに頼ることができます:

# Using R 2.14.2
# The same toy data
foo <- data.frame(start.time = c("2012-02-06 15:47:00", 
                                 "2012-02-06 15:02:00",
                                 "2012-02-22 10:08:00"),
                  duration   = c(1,2,3))

クラス POSIXct には構造化された方法で日時情報が含まれているためsubstr、POSIXct ベクトル内の時間位置の文字を抽出することができます。つまり、POSIXct の形式 (印刷時にどのように表示されるか) がわかっていれば、時間と分を抽出できます。

# Extract hour and minute as a character vector, of the form "%H:%M"
substr(foo$start.time, 12, 16)

そして、それを任意の日付に貼り付けて、POSIXct に戻します。この例では、2012 年 1 月 1 日を使用していますが、日付を指定せずに代わりにformatR を使用すると、現在の日付が使用されます。

# Store time information as POSIXct, using an arbitrary date
foo$time <- as.POSIXct(paste("2012-01-01", substr(foo$start.time, 12, 16)))

そして両方とも、POSIXct ですぐに時刻をフォーマットする方法plotggplot2知っています。

# Plot it using base graphics
plot(duration~time, data=foo)

# Plot it using ggplot2 (0.9.2.1)
library(ggplot2)
qplot(x=time, y=duration, data=foo)
于 2012-10-12T23:18:05.283 に答える