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.

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" 

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')

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

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

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

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

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"))

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.