2011-11-06 75 views
8

En R, ¿cómo puedo asociar un vector de fechas (días) y semanas?¿Cómo puedo agrupar los días en semanas?

Editar: "semanas" debería ser el índice de la semana dentro del rango de fechas y no dentro del año. Mis disculpas por la ambigüedad.

+8

eche un vistazo al paquete 'lubridate' que hace que el manejo de' fechas' sea muy fácil. por ejemplo 'week (x)' devolvería el número de semana de la fecha x. – Ramnath

+3

-1 Re la edición - Entonces, ¿cómo podemos saber cuál es tu índice de semana personal si no lo haces i) cuéntanos sobre él antes, y ii) ** mostrar ** tus datos o un fragmento de él? –

+0

@ GavinSimpson- tienes razón. Debería haber sido más claro. – JohnRos

Respuesta

15

¿Simplemente desea el número de intervalos de 7 días completados desde el primer registro?

dvec <- as.Date("2001-04-01")+0:90 
dweek <- as.numeric(dvec-dvec[1]) %/% 7 
dweek[1:21] 
# [1] 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 
+1

+1 para la deducción –

+0

@GavinSimpson: Yo "+() - edé" también, ya que fueron sus esfuerzos los que proporcionaron la base para la deducción. (Ahora obtengo una ventana emergente "Gavin Simpson" cuando escribo "@Gavin". Neat.) –

+1

Y a usted le encanta la función de división entera '% /%' - Le daría otro +1 por eso si Podría: la respuesta es muy clara y concisa. –

8

strftime es su amigo ...

? strftime # to see the help and the format 

set.seed(1) 
dates <- Sys.Date() + sample(1:365, size = 10) 

R> dates 
[1] "2012-02-11" "2012-03-21" "2012-06-01" "2012-09-30" 
[5] "2012-01-18" "2012-09-25" "2012-10-11" "2012-06-30" 
[9] "2012-06-18" "2011-11-28" 

# %j for julian day - number of the day since the 1st of january each year 

R> strftime(dates, format = "%j") # or format(dates, format = "%j") 
[1] "042" "081" "153" "274" "018" "269" "285" "182" "170" "332" 

R> strftime(dates, format = "%w") 
[1] "6" "3" "5" "0" "3" "2" "4" "6" "1" "1" 

# my locale is in French so... 
R> strftime(dates, format = "%A") 
[1] "samedi" "mercredi" "vendredi" "dimanche" "mercredi" 
[6] "mardi" "jeudi" "samedi" "lundi" "lundi" 

Por cierto ¿qué es lo que entendemos por día, el día en el mes, la semana o el año?

20

Para cada fecha, obtenga la semana del año a la que pertenece formateándola a través de format() utilizando los marcadores de posición de formato %U de %W. %U trata el domingo como el primer día de la semana, mientras que %W considera que el lunes es el primer día de la semana. He aquí un ejemplo:

now <- as.Date(Sys.time()) 
dates <- seq(now, now + 25, by = "1 day") 

dat <- data.frame(Dates = dates, Week = format(dates, format = "%W")) 
head(dat, 10) 

cual da:

> head(dat, 10) 
     Dates Week 
1 2011-11-06 44 
2 2011-11-07 45 
3 2011-11-08 45 
4 2011-11-09 45 
5 2011-11-10 45 
6 2011-11-11 45 
7 2011-11-12 45 
8 2011-11-13 45 
9 2011-11-14 46 
10 2011-11-15 46 

Aunque no está claro por su pregunta exactamente lo que quiere hacer, de manera que coincida con este vector de fechas (bueno, mi trama de datos dat arriba) es a través de merge(). Digamos que tenemos un vector de semanas que queremos hacer coincidir en contra y algunos datos relacionados en el marco de datos weekdat:

weekdat <- data.frame(Week = 44:50, Price = c(10, 20, 25, 30, 20, 15, 10)) 

entonces podemos vincular dat con weekdat usando merge() como tan:

> merge(dat, weekdat) 
    Week  Dates Price 
1 44 2011-11-06 10 
2 45 2011-11-07 20 
3 45 2011-11-08 20 
4 45 2011-11-09 20 
5 45 2011-11-10 20 
6 45 2011-11-11 20 
7 45 2011-11-12 20 
8 45 2011-11-13 20 
9 46 2011-11-14 25 
10 46 2011-11-15 25 
11 46 2011-11-16 25 
12 46 2011-11-17 25 
13 46 2011-11-18 25 
14 46 2011-11-19 25 
15 46 2011-11-20 25 
16 47 2011-11-21 30 
17 47 2011-11-22 30 
18 47 2011-11-23 30 
19 47 2011-11-24 30 
20 47 2011-11-25 30 
21 47 2011-11-26 30 
22 47 2011-11-27 30 
23 48 2011-11-28 20 
24 48 2011-11-29 20 
25 48 2011-11-30 20 
26 48 2011-12-01 20 

Hay otra formas de emparejar o vincular fechas a semanas, pero lo anterior debería darle algo para trabajar.

Cuestiones relacionadas