Znajdź dzień tygodnia

215

Powiedzmy, że mam datę w R i jest ona sformatowana w następujący sposób.

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

Czy w R jest jakikolwiek sposób na dodanie kolejnej kolumny z dniem tygodnia powiązanym z datą? Zestaw danych jest naprawdę duży, więc nie ma sensu przechodzić ręcznie i wprowadzać zmian.

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

Po dodaniu dni wyglądałoby to tak:

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

czy to możliwe? Czy ktoś może wskazać mi pakiet, który pozwoli mi to zrobić? Próbuję automatycznie wygenerować dzień według daty.

ATMathew
źródło

Odpowiedzi:

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

Edycja: aby pokazać inny sposób ...

wdaySkładnikiem POSIXltprzedmiotu jest tygodnia numerycznych (0-6 wyjścia w niedzielę).

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

którego można użyć do podzbioru wektora znaków nazw dni powszednich

c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
    "Friday", "Saturday")[as.POSIXlt(df$date)$wday + 1]
## [1] "Wednesday" "Wednesday" "Thursday" 
GSee
źródło
3
+1 Czy istnieje sposób na weekdaysuzyskanie liczby dni tygodnia, tak jak przy użyciu as.POSIXlt?
Shambho
3
@Shambho Myślę, że można to zrobić: setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. Jeśli nie lubisz tych nazw, możesz je owinąć unname().
GSee
6
Aby uzyskać numer dnia tygodnia (0–6, nie-sob.) Od daty, którą możesz zrobić: sformatuj (as.Date (df $ date), „% w”). Aby uzyskać szczegółowe informacje na temat kodu formatu, patrz stat.berkeley.edu/~s133/dates.html
JStrahl
65

Spójrz w górę ?strftime:

%A Pełna nazwa dnia tygodnia w bieżącym języku

df$day = strftime(df$date,'%A')
nograpes
źródło
15
W przypadku, gdyby ktoś szukał numeru dnia tygodnia - użyj '%u'zamiast'%A'
Vlad Holubiev
64

Użyj lubridatepakietu i funkcji 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
źródło
11
Zaletą tego podejścia jest to, że zwraca dni jako czynnik, więc jeśli utworzysz wykres, dni będą we właściwej kolejności.
bobfet1
Aby uzyskać pełne słowo na każdy dzień (np. Niedziela zamiast niedziela):abbr = FALSE
stevec
17

Załóżmy, że dodatkowo chcesz, aby tydzień zaczynał się w poniedziałek (zamiast domyślnie w niedzielę), pomocne są następujące czynności:

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

Wynikiem są dni w przedziale [0, .., 6].

Jeśli chcesz, aby interwał wynosił [1, .. 7], użyj następujących poleceń:

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

... lub alternatywnie:

df$day = df$day + 1
Peter Lustig
źródło
5
Możesz także użyć argumentu week_start:wday(df$date, label = TRUE, week_start = 1)
mrub
12

To powinno załatwić sprawę

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
źródło
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
źródło
3

z komentarza JStrahl format(as.Date(df$date),"%w")otrzymujemy numer bieżącego dnia: as.numeric(format(as.Date("2016-05-09"),"%w"))

Qbik
źródło