Trouver le jour d'une semaine


215

Disons que j'ai une date en R et qu'elle est formatée comme suit.

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

Existe-t-il un moyen dans R d'ajouter une autre colonne avec le jour de la semaine associé à la date? L'ensemble de données est vraiment volumineux, il ne serait donc pas judicieux de procéder manuellement et d'apporter les modifications.

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

Donc, après avoir ajouté les jours, cela finirait par ressembler à:

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

Est-ce possible? Quelqu'un peut-il m'indiquer un package qui me permettra de le faire? J'essaie simplement de générer automatiquement le jour par la date.

Réponses:


298
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: Juste pour montrer une autre façon ...

Le wdaycomposant d'un POSIXltobjet est le jour de semaine numérique (0-6 commençant le dimanche).

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

que vous pouvez utiliser pour sous-définir un vecteur de caractères de noms de semaine

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

3
+1 Existe-t-il un moyen d'utiliser weekdayspour obtenir le nombre de jours de la semaine comme vous le faites avec as.POSIXlt??
— Shambho

3
@Shambho Je suppose que vous pourriez faire ceci: setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. Si vous n'aimez pas les noms, vous pouvez les envelopper unname().
— GSee

6
Pour obtenir le numéro de jour de la semaine (0-6, dim-sam) à partir de la date que vous pouvez faire: format (as.Date (df $ date), "% w"). Pour les détails du code de format, voir stat.berkeley.edu/~s133/dates.html
— JStrahl

65

Utilisez le lubridatepackage et la fonction 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

11
La bonne chose à propos de cette approche est qu'elle renvoie les jours comme facteur, donc si vous créez un graphique, les jours seront dans le bon ordre.
— bobfet1

Pour obtenir le mot complet pour chaque jour (par exemple dimanche au lieu de soleil):abbr = FALSE
— stevec

65

Rechercher ?strftime:

%A Nom complet du jour de la semaine dans les paramètres régionaux actuels

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

15
Dans le cas où quelqu'un a cherché un numéro de semaine - utilisez '%u'au lieu de'%A'
— Vlad Holubiev

17

Supposons que vous souhaitiez en outre que la semaine commence le lundi (au lieu de la valeur par défaut le dimanche), alors ce qui suit est utile:

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

Le résultat est le nombre de jours dans l'intervalle [0, .., 6].

Si vous souhaitez que l'intervalle soit [1, .. 7], utilisez ce qui suit:

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

... Ou bien:

df$day = df$day + 1

5
Vous pouvez également utiliser l'argument week_start:wday(df$date, label = TRUE, week_start = 1)
— mrub

12

Cela devrait faire l'affaire

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

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

3

sous forme de commentaire de JStrahl format(as.Date(df$date),"%w"), nous obtenons le nombre de jours en cours: as.numeric(format(as.Date("2016-05-09"),"%w"))

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.