Encontre o dia da semana

215

Digamos que eu tenho uma data em R e está formatada da seguinte forma.

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

Existe alguma maneira no R de adicionar outra coluna ao dia da semana associado à data? O conjunto de dados é realmente grande, portanto, não faria sentido passar manualmente e fazer as alterações.

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

Então, depois de adicionar os dias, acabaria parecendo:

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

Isso é possível? Alguém pode me indicar um pacote que me permita fazer isso? Apenas tentando gerar automaticamente o dia pela data.

ATMathew
fonte

Respostas:

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

Edit: Apenas para mostrar outra maneira ...

O wdaycomponente de um POSIXltobjeto é o dia da semana numérico (0-6 a partir de domingo).

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

que você pode usar para definir um vetor de caracteres dos nomes dos dias da semana

c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
    "Friday", "Saturday")[as.POSIXlt(df$date)$wday + 1]
## [1] "Wednesday" "Wednesday" "Thursday" 
GSee
fonte
3
+1 Existe uma maneira de usar weekdayspara obter o número de dias da semana como você usa as.POSIXlt??
Shambho 4/06/2014
3
@Shambho Eu acho que você poderia fazer isso: setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. Se você não gosta dos nomes, pode envolvê unname()-lo.
precisa
6
Para obter o número do dia da semana (0-6, dom-sáb) a partir da data que você pode fazer: format (as.Date (df $ date), "% w"). Para obter os detalhes do código de formato, consulte stat.berkeley.edu/~s133/dates.html
JStrahl
65

Procure ?strftime:

%A Nome completo do dia da semana na localidade atual

df$day = strftime(df$date,'%A')
nograpes
fonte
15
Caso alguém '%u''%A'
procure
64

Use o lubridatepacote e a função 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
fonte
11
O bom dessa abordagem é que ela retorna os dias como um fator; portanto, se você criar um gráfico, os dias estarão na ordem correta.
Jun
Para obter a palavra completa para cada dia (por exemplo, domingo em vez de domingo):abbr = FALSE
stevec
17

Digamos que você queira adicionalmente que a semana comece na segunda - feira (em vez do padrão no domingo), então o seguinte é útil:

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

O resultado são os dias no intervalo [0, .., 6].

Se você deseja que o intervalo seja [1, .. 7], use o seguinte:

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

... ou alternativamente:

df$day = df$day + 1
Peter Lustig
fonte
5
Você também pode usar o argumento week_start:wday(df$date, label = TRUE, week_start = 1)
mrub 23/05
12

Isso deve fazer o truque

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
Tyler Rinker
fonte
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
fonte
3

No comentário de JStrahl format(as.Date(df$date),"%w"), obtemos o número do dia atual: as.numeric(format(as.Date("2016-05-09"),"%w"))

Qbik
fonte