曜日を見つける


215

Rに日付があり、次のようにフォーマットされているとしましょう。

   date      
2012-02-01 
2012-02-01
2012-02-02

Rに日付に関連付けられた曜日を含む別の列を追加する方法はありますか?データセットは非常に大きいため、手動で変更を加えても意味がありません。

df = data.frame(date=c("2012-02-01", "2012-02-01", "2012-02-02")) 

したがって、日数を追加すると、次のようになります。

   date       day
2012-02-01   Wednesday
2012-02-01   Wednesday
2012-02-02   Thursday

これは可能ですか?これを可能にするパッケージを誰かに教えてもらえますか?日付で自動的に日を生成しようとしています。

回答:


297
df = data.frame(date=c("2012-02-01", "2012-02-01", "2012-02-02")) 
df$day <- weekdays(as.Date(df$date))
df
##         date       day
## 1 2012-02-01 Wednesday
## 2 2012-02-01 Wednesday
## 3 2012-02-02  Thursday

編集:別の方法を示すためだけに...

オブジェクトのwdayコンポーネントPOSIXltは、数値の曜日(日曜日から始まる0〜6)です。

as.POSIXlt(df$date)$wday
## [1] 3 3 4

曜日名の文字ベクトルをサブセット化するために使用できます

c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
    "Friday", "Saturday")[as.POSIXlt(df$date)$wday + 1]
## [1] "Wednesday" "Wednesday" "Thursday" 

3
+1を使用するのweekdaysと同じように、平日の数を取得する方法はありますas.POSIXltか?
Shambho

3
@Shambho私はあなたがこれを行うことができると思います:setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]。名前が気に入らない場合は、ラップunname()してください。
GSee 2014年

6
日付から曜日番号(0-6、Sun-Sat)を取得するには、format(as.Date(df $ date)、 "%w")を実行します。フォーマットコードの詳細については、stat.berkeley.edu
〜s133 / dates.htmlを

65

見上げる?strftime

%A 現在のロケールでの完全な曜日名

df$day = strftime(df$date,'%A')

15
誰かが平日の番号を検索した場合- '%u'代わりに使用'%A'
Vlad Holubiev

64

lubridateパッケージと関数を使用しますwday

library(lubridate)
df$date <- as.Date(df$date)
wday(df$date, label=TRUE)
[1] Wed   Wed   Thurs
Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat

11
この方法の良いところは、日数を因子として返すので、グラフを作成した場合、日数は正しい順序になります。
bobfet1 2013年

毎日の完全な単語を取得するには(たとえば、Sunではなく、Sunday):abbr = FALSE
stevec

17

さらに、週を月曜日(日曜日のデフォルトの代わりに)から開始したい場合、以下が役に立ちます。

require(lubridate)
df$day = ifelse(wday(df$time)==1,6,wday(df$time)-2)

結果は、間隔[0、..、6]の日数です。

間隔を[1、.. 7]にしたい場合は、以下を使用します。

df$day = ifelse(wday(df$time)==1,7,wday(df$time)-1)

...または、代わりに:

df$day = df$day + 1

5
また、引数に使用することができますweek_startwday(df$date, label = TRUE, week_start = 1)
mrub

12

これでうまくいくはずです

df = data.frame(date=c("2012-02-01", "2012-02-01", "2012-02-02")) 
dow <- function(x) format(as.Date(x), "%A")
df$day <- dow(df$date)
df

#Returns:
        date       day
1 2012-02-01 Wednesday
2 2012-02-01 Wednesday
3 2012-02-02  Thursday

6
start = as.POSIXct("2017-09-01")
end = as.POSIXct("2017-09-06")

dat = data.frame(Date = seq.POSIXt(from = start,
                                   to = end,
                                   by = "DSTday"))

# see ?strptime for details of formats you can extract

# day of the week as numeric (Monday is 1)
dat$weekday1 = as.numeric(format(dat$Date, format = "%u"))

# abbreviated weekday name
dat$weekday2 = format(dat$Date, format = "%a")

# full weekday name
dat$weekday3 = format(dat$Date, format = "%A")

dat
# returns
    Date       weekday1 weekday2  weekday3
1 2017-09-01        5      Fri    Friday
2 2017-09-02        6      Sat    Saturday
3 2017-09-03        7      Sun    Sunday
4 2017-09-04        1      Mon    Monday
5 2017-09-05        2      Tue    Tuesday
6 2017-09-06        3      Wed    Wednesday

3

JStrahlのコメントのフォームformat(as.Date(df$date),"%w")、当日の数を取得します。 as.numeric(format(as.Date("2016-05-09"),"%w"))

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