Finde den Wochentag

215

Angenommen, ich habe ein Datum in R und es ist wie folgt formatiert.

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

Gibt es in R eine Möglichkeit, eine weitere Spalte mit dem Wochentag hinzuzufügen, der dem Datum zugeordnet ist? Der Datensatz ist sehr groß, daher ist es nicht sinnvoll, ihn manuell durchzugehen und die Änderungen vorzunehmen.

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

Nach dem Hinzufügen der Tage würde es also so aussehen:

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

Ist das möglich? Kann mich jemand auf ein Paket verweisen, mit dem ich dies tun kann? Ich versuche nur, den Tag automatisch nach dem Datum zu generieren.

ATMathew
quelle

Antworten:

297
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: Nur um einen anderen Weg zu zeigen ...

Die wdayKomponente eines POSIXltObjekts ist der numerische Wochentag (0-6 ab Sonntag).

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

Hiermit können Sie einen Zeichenvektor mit Wochentagsnamen unterteilen

c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
    "Friday", "Saturday")[as.POSIXlt(df$date)$wday + 1]
## [1] "Wednesday" "Wednesday" "Thursday" 
GSee
quelle
3
+1 Gibt es eine Möglichkeit weekdays, die Anzahl der Wochentage zu ermitteln, die Sie verwenden as.POSIXlt?
Shambho
3
@Shambho Ich denke, Sie könnten dies tun : setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. Wenn Sie die Namen nicht mögen, können Sie sie umschließen unname().
GSee
6
Um die Wochentagsnummer (0-6, So-Sa) von dem Datum zu erhalten, können Sie Folgendes tun: Format (as.Date (df $ date), "% w"). Einzelheiten zum Formatcode finden
JStrahl
65

Nachschlagen ?strftime:

%A Vollständiger Wochentagsname im aktuellen Gebietsschema

df$day = strftime(df$date,'%A')
Nograpes
quelle
15
Falls jemand nach einer Wochentagsnummer gesucht hat - verwenden Sie '%u'statt'%A'
Vlad Holubiev
64

Verwenden Sie das lubridatePaket und die Funktion 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
quelle
11
Das Gute an diesem Ansatz ist, dass die Tage als Faktor zurückgegeben werden. Wenn Sie also ein Diagramm erstellen, sind die Tage in der richtigen Reihenfolge.
Bobfet1
Um das vollständige Wort für jeden Tag zu erhalten (z. B. Sonntag statt Sonne):abbr = FALSE
stevec
17

Angenommen, Sie möchten zusätzlich, dass die Woche am Montag beginnt (anstelle der Standardeinstellung am Sonntag). Dann ist Folgendes hilfreich:

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

Das Ergebnis sind die Tage im Intervall [0, .., 6].

Wenn das Intervall [1, .. 7] sein soll, verwenden Sie Folgendes:

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

... oder alternativ:

df$day = df$day + 1
Peter Lustig
quelle
5
Sie können auch das Argument verwenden week_start:wday(df$date, label = TRUE, week_start = 1)
Mrub
12

Dies sollte den Trick tun

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
quelle
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
quelle
3

Formular Kommentar von JStrahl format(as.Date(df$date),"%w"), wir erhalten die Nummer des aktuellen Tages: as.numeric(format(as.Date("2016-05-09"),"%w"))

Qbik
quelle