R でランダムに日付を生成する必要があったので、調べてみたらネットには情報が見つかりませんでした。
私の自己流を紹介します。
2014/12/01 から 2014/12/31 までの日付をランダムに生成するには、普通に考えると次のやり方が思いつきます。
R
date_seq <- seq(as.Date("2014-12-01"), as.Date("2014-12-31"), by="days")
dates <- sample(date_seq, size = 100, replace = TRUE)
print(dates[1:5])
結果
"2014-12-06" "2014-12-02" "2014-12-11" "2014-12-11" "2014-12-23"
まず、日付のシーケンスを作って、それからランダムサンプリングする方法です。
日付だけならこの方法で十分ですが、時刻付きの日付をランダムに生成したいときに困ります。
時刻付きの日付のシーケンスをあらかじめ用意しておくことは難しいからです。
そこで、Date
型は数値を加えることによって日付加算できることを思い出します。
R
as.Date("2014-12-01")
as.Date("2014-12-01") + 1
結果
"2014-12-01"
"2014-12-02"
従って、次のようにすればランダムな日付を生成できます。
R
dates <- as.Date("2014-12-01") + sample(0:30, size=100, replace=TRUE)
dates[1:5]
結果
"2014-12-26" "2014-12-16" "2014-12-07" "2014-12-18" "2014-12-02"
これに倣えば、時刻付きの日付をランダム生成することができます。
R
datetimes <- as.POSIXlt("2014-12-01", tz="Japan") +
sample(seq(31*24*60*60)-1, size=100, replace=TRUE)
datetimes[1:3]
結果
"2014-12-29 00:31:47 JST" "2014-12-27 12:20:42 JST" "2014-12-13 12:02:37 JST"
POSIXlt
は、数値を加算すると1秒加算されることに注意してください。
R
as.POSIXlt("2014-12-01", tz="Japan")
as.POSIXlt("2014-12-01", tz="Japan") + 1
結果
"2014-12-01 JST"
"2014-12-01 00:00:01 JST"
POSIXct
に対しても同様にできます。
R
datetimes <- as.POSIXct("2014-12-01", tz="Japan") +
sample(seq(31*24*60*60)-1, size=100, replace=TRUE)
datetimes[1:3]
結果
"2014-12-15 20:37:52 JST" "2014-12-25 17:08:25 JST" "2014-12-01 18:36:55 JST"
ちなみに、時間区切りの日付をランダムに生成したいときは、次のようにすればできます。
R
datetime_seq <- seq(as.POSIXlt("2014-12-01", tz="Japan"),
as.POSIXlt("2015-01-01", tz="Japan"), by="hour")
datetime_seq <- datetime_seq[-length(datetime_seq)]
datetimes <- sample(datetime_seq, size=100, replace=TRUE)
datetimes[1:3]
結果
"2014-12-11 04:00:00 JST" "2014-12-26 13:00:00 JST" "2014-12-12 06:00:00 JST"
以上です。