2012-02-09 11 views
152

Załóżmy, że mam datę w R i jest ona sformatowana w następujący sposób.Znajdź dzień tygodnia

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

Czy istnieje sposób w R, aby dodać kolejną kolumnę z dniem tygodnia związanym z datą? Zbiór danych jest naprawdę duży, więc nie ma sensu przechodzić ręcznie i wprowadzać zmiany.

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

Więc po dodaniu dni, to w końcu wygląda 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ć? Po prostu próbuję automatycznie wygenerować dzień według daty.

Odpowiedz

218
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: Wystarczy pokazać inną drogę ...

wday składnikiem POSIXlt obiektu jest dzień tygodnia numeryczny (0-6 począwszy od niedzieli).

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

które można użyć do podzbioru wektor znaków nazw dni tygodnia

c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
    "Friday", "Saturday")[as.POSIXlt(df$date)$wday + 1] 
## [1] "Wednesday" "Wednesday" "Thursday" 
+2

+1 Czy istnieje sposób użycia 'dni tygodnia', aby uzyskać numer dnia tygodnia, jak to robisz używając 'as.POSIXlt' ?? – Shambho

+2

@Shambho Sądzę, że możesz to zrobić: 'setNames (0: 6, c (" niedziela "," poniedziałek "," wtorek "," środa "," czwartek "," piątek "," sobota ")) [dni robocze (as.Date (df $ date))] '. Jeśli nie lubisz tych nazw, możesz owinąć wokół niego "unname()". – GSee

+4

Aby uzyskać numer dnia tygodnia (0-6, niedz-sob) od daty, którą możesz zrobić: format (jako. Data (df $ data), "% w"). Szczegóły kodu formatu można znaleźć na stronie http://www.stat.berkeley.edu/~s133/dates.html – JStrahl

50

Spójrz ?strftime:

df$day = strftime(df$date,'%A') 
+7

Jeśli ktoś szuka tygodnia drętwienia er - użyj ''% u'' zamiast ''% A'' –

+0

O wiele lepiej niż najlepsza odpowiedź. Krótki i wyraźny. – wordsforthewise

33

Użyj pakiet lubridate 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 
+7

Dobrą rzeczą w tym podejściu jest to, że zwraca dni jako czynnik, więc jeśli utworzysz wykres, dni będą w poprawnej kolejności. – bobfet1

10

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 
15

Załóżmy dodatkowo chcą tydzień rozpoczną się poniedziałek (zamiast domyślnego w niedzielę), a następnie po jest pomocna:

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

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

Jeśli chcesz być przedział [1 .. 7], należy użyć następujących:

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

... albo, alternatywnie:

df$day = df$day + 1 
1

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

1
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 
Powiązane problemy