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.