Найдите день недели

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

Это возможно? Может кто-нибудь указать мне пакет, который позволит мне сделать это? Просто пытаюсь автоматически сгенерировать день по дате.

ATMathew
источник

Ответы:

298
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" 
GSEE
источник
3
+1 Есть ли способ использовать, weekdaysчтобы получить номер дня недели, как вы используете as.POSIXlt?
Шамбхо
3
@ Shambho Я думаю, вы могли бы сделать это setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. Если вам не нравятся имена, вы можете обернуть unname()их.
GSee
6
Чтобы получить номер дня недели (0-6, вс-сб) из даты, которую вы можете сделать: формат (as.Date (df $ date), "% w"). Подробные сведения о коде формата см. Stat.berkeley.edu/~s133/dates.html
JStrahl
65

Используйте 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
Andrie
источник
11
Хорошая вещь в этом подходе состоит в том, что он возвращает дни как фактор, поэтому, если вы создадите диаграмму, дни будут в правильном порядке.
bobfet1
Чтобы получить полное слово для каждого дня (например, воскресенье вместо солнца):abbr = FALSE
Stevec
65

Посмотрите вверх ?strftime:

%A Полное название дня недели в текущей локали

df$day = strftime(df$date,'%A')
nograpes
источник
15
Если кто-то искал номер дня недели - используйте '%u'вместо'%A'
Влад Голубев
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_start:wday(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
s_scolary
источник
3

Из формы комментария JStrahl format(as.Date(df$date),"%w")получаем номер текущего дня: as.numeric(format(as.Date("2016-05-09"),"%w"))

Qbik
источник