web-dev-qa-db-ja.com

2つの日付間のすべての日のベクトルを作成する

Rで2つの指定された日付の間に発生したすべての有効な日を簡単に項目化する方法はありますか?たとえば、次の入力が必要です。

itemizeDates(startDate="12-30-11", endDate="1-4-12")

次の日付を作成するには:

"12-30-11" "12-31-11", "1-1-12", "1-2-12", "1-3-12", "1-4-12"

私はクラスと日付の書式設定に柔軟性があり、コンセプトの実装が必要です。

53
Jeff Allen

seqを探しています

> seq(as.Date("2011-12-30"), as.Date("2012-01-04"), by="days")
[1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
[6] "2012-01-04"

または、:を使用できます

> as.Date(as.Date("2011-12-30"):as.Date("2012-01-04"), Origin="1970-01-01")
[1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
[6] "2012-01-04"

特定のリクエストに応えるための機能を次に示します

itemizeDates <- function(startDate="12-30-11", endDate="1-4-12", 
                         format="%m-%d-%y") {
  out <- seq(as.Date(startDate, format=format), 
             as.Date(endDate, format=format), by="days")  
  format(out, format)
}

> itemizeDates(startDate="12-30-11", endDate="1-4-12")
[1] "12-30-11" "12-31-11" "01-01-12" "01-02-12" "01-03-12" "01-04-12"
93
GSee

日時の問題を解決するためにlubridateパッケージを使用することを好みます。直感的に理解でき、理解しやすくなります。

library(lubridate)
#mdy() in lubridate package means "month-day-year", which is used to convert
#the string to date object
>start_date <- mdy("12-30-11")
>end_date <- mdy("1-4-12")
#calculate how many days in this time interval
>n_days <- interval(start_date,end_date)/days(1)
>start_date + days(0:n_days)
[1]"2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04"
#convert to original format
format(start_date + days(0:n_days), format="%m-%d-%y")
[1] "12-30-11" "12-31-11" "01-01-12" "01-02-12" "01-03-12" "01-04-12"

参照: lubridateで日付と時刻を簡単に

10
Yifu Yan