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.

ATMathew
la source

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" 
GSee
la source
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
Andrie
la source
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')
nograpes
la source
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
Peter Lustig
la source
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
Tyler Rinker
la source
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
s_scolary
la source
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"))

Qbik
la source