Encuentra el día de una semana


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 manera 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 ir a través de forma manual y hacer los cambios.

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

Así que después de agregar los días, terminaría como:

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

Es esto posible? ¿Alguien puede indicarme un paquete que me permita hacer esto? Tratando de forma automática generar el día por la fecha.

 171
Author: Henrik, 2012-02-09

7 answers

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 otro camino...

El componente wday de un objeto POSIXlt es el día numérico de la semana (0-6 a partir del domingo).

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

Que podría usar para subconjunto de un vector de caracteres de nombres de días de la semana

c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
    "Friday", "Saturday")[as.POSIXlt(df$date)$wday + 1]
## [1] "Wednesday" "Wednesday" "Thursday" 
 241
Author: GSee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-02 08:04:35

Busca ?strftime:

%A Nombre completo del día de la semana en la configuración regional actual

df$day = strftime(df$date,'%A')
 56
Author: nograpes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-08 11:36:19

Utilice el paquete lubridate 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
 39
Author: Andrie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-09 17:58:41

Digamos que además desea que la semana comience el Lunes (en lugar de predeterminado el domingo), 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], utilice lo siguiente:

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

... o, alternativamente:

df$day = df$day + 1
 17
Author: Peter Lustig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-02 11:33:08

Esto debería hacer el truco

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
 11
Author: Tyler Rinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-09 18:06:06

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

 3
Author: Qbik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-09 13:04:53
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
Author: anotherFishGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-28 14:38:39