2012-02-09 9 views
152

Digamos que tengo una fecha en R y está formateada de la siguiente manera.Encuentra el día de una semana

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 pasar manualmente y realizar los cambios.

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

Así que después de la adición de los días, sería terminar pareciéndose a:

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? Solo intento generar automáticamente el día por fecha.

Respuesta

218
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: sólo para mostrar otra manera ...

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

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

que se podría utilizar para un subconjunto de un vector de caracteres de los nombres de los días de semana

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

+1 ¿Hay alguna manera de usar 'weekdays' para obtener el número de días de la semana como lo hace con' as.POSIXlt' ?? – Shambho

+2

@Shambho Supongo que podría hacer esto: 'setNames (0: 6, c (" Sunday "," Monday "," Tuesday "," Wednesday "," Thursday "," Friday "," Saturday ")) [entre semana (como.Fecha (df $ date))] '. Si no te gustan los nombres, puedes envolver 'unname()' a su alrededor. – GSee

+4

Para obtener el número de día de la semana (0-6, dom-sáb) a partir de la fecha en que puede hacer: formato (como.Fecha (df $ date), "% w"). Para los detalles del código de formato, consulte http://www.stat.berkeley.edu/~s133/dates.html – JStrahl

50

Busque ?strftime:

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

En caso de que alguien buscaba un insensible día de la semana er - use ''% u'' en lugar de''% A'' –

+0

Mucho mejor que la respuesta principal. Corto y claro. – wordsforthewise

33

utilizar el paquete lubridate y 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 
+7

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

10

Esto debe 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 
15

Digamos que, además, desea que la semana comience en Lunes (en lugar de por defecto el domingo), a continuación, la 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 la siguiente:

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

... o, alternativamente:

df$day = df$day + 1 
1

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

1
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 
Cuestiones relacionadas