Encuentra el día de una semana

215

Digamos que tengo una fecha en R y está formateada de la siguiente manera.

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

¿Hay alguna forma en R de agregar otra columna con el día de la semana asociado con la fecha? El conjunto de datos es realmente grande, por lo que no tendría sentido revisarlo manualmente y realizar los cambios.

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

Entonces, después de agregar los días, terminaría luciendo así:

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

es posible? ¿Alguien puede señalarme un paquete que me permita hacer esto? Solo trato de generar automáticamente el día por la fecha.

ATMathew
fuente

Respuestas:

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

Editar: solo para mostrar otra forma ...

El wdaycomponente de un POSIXltobjeto es el día de la semana numérico (0-6 a partir del domingo).

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

que puedes usar para subconjuntar un vector de caracteres de los nombres de los días laborables

c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
    "Friday", "Saturday")[as.POSIXlt(df$date)$wday + 1]
## [1] "Wednesday" "Wednesday" "Thursday" 
GSee
fuente
3
+1 ¿Hay alguna forma de usar weekdayspara obtener el número de días de la semana como lo haces usando as.POSIXlt?
Shambho
3
@Shambho Creo que se puede hacer esto: setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. Si no te gustan los nombres, puedes envolverlo unname().
GSee
66
Para obtener el número del día de la semana (0-6, dom-sáb) a partir de la fecha que puede hacer: formatee (as.Date (df $ date), "% w"). Para ver los detalles del código de formato, consulte stat.berkeley.edu/~s133/dates.html
JStrahl el
65

Mirar hacia arriba ?strftime:

%A Nombre completo del día de la semana en el entorno local actual

df$day = strftime(df$date,'%A')
nograpes
fuente
15
En caso de que alguien busque un número entre semana'%u''%A'
úselo en
64

Use el lubridatepaquete y la función 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
fuente
11
Lo bueno de este enfoque es que devuelve los días como un factor, por lo que si crea un gráfico, los días estarán en el orden correcto.
bobfet1
Para obtener la palabra completa para cada día (por ejemplo, domingo en lugar de domingo):abbr = FALSE
stevec
17

Supongamos que también desea que la semana comience el lunes (en lugar del domingo predeterminado), entonces lo siguiente es útil:

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

El resultado son los días en el intervalo [0, .., 6].

Si desea que el intervalo sea [1, .. 7], use lo siguiente:

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

... o alternativamente:

df$day = df$day + 1
Peter Lustig
fuente
55
También puede usar el argumento week_start:wday(df$date, label = TRUE, week_start = 1)
mrub
12

Esto debería funcionar

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
fuente
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
fuente
3

formulario comentario de JStrahl format(as.Date(df$date),"%w"), obtenemos el número del día actual: as.numeric(format(as.Date("2016-05-09"),"%w"))

Qbik
fuente