Tìm ngày trong tuần


215

Hãy nói rằng tôi có một ngày trong R và nó được định dạng như sau.

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

Có cách nào trong R để thêm một cột khác với ngày trong tuần liên quan đến ngày không? Bộ dữ liệu thực sự lớn, vì vậy sẽ không có ý nghĩa khi thực hiện thủ công và thực hiện các thay đổi.

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

Vì vậy, sau khi thêm ngày, nó sẽ trông giống như:

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

Điều này có thể không? Bất cứ ai có thể chỉ cho tôi một gói sẽ cho phép tôi làm điều này? Chỉ cần cố gắng để tự động tạo ra theo ngày.

Câu trả lời:


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

Chỉnh sửa: Chỉ để hiển thị một cách khác ...

Thành wdayphần của một POSIXltđối tượng là ngày trong tuần số (0-6 bắt đầu vào Chủ nhật).

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

mà bạn có thể sử dụng để đặt một vectơ ký tự của các tên trong tuần

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

3
+1 Có cách nào để sử dụng weekdaysđể có được số ngày trong tuần như bạn đang sử dụng không as.POSIXlt??
Shambho

3
@Shambho Tôi đoán bạn có thể làm điều này : setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. Nếu bạn không thích tên, bạn có thể quấn unname()quanh nó.
GSee

6
Để lấy số ngày trong tuần (0-6, Chủ Nhật) từ ngày bạn có thể làm: định dạng (as.Date (df $ date), "% w"). Để biết chi tiết mã định dạng, hãy xem stat.ber siêu.edu / ~ s133 / date.html
JStrahl

65

Tra cứu ?strftime:

%A Tên đầy đủ các ngày trong tuần tại địa phương hiện tại

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

15
Trong trường hợp ai đó đã tìm kiếm số ngày trong tuần - hãy sử dụng '%u'thay vì'%A'
Vlad Holubiev

64

Sử dụng lubridategói và chức năng 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
Điểm hay của phương pháp này là nó trả về số ngày là một yếu tố, vì vậy nếu bạn tạo một biểu đồ thì ngày sẽ theo đúng thứ tự.
bobfet1

Để có được từ đầy đủ cho mỗi ngày (ví dụ Chủ nhật thay vì Mặt trời):abbr = FALSE
stevec

17

Giả sử bạn cũng muốn tuần bắt đầu vào thứ Hai (thay vì mặc định vào Chủ nhật), thì những điều sau đây rất hữu ích:

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

Kết quả là những ngày trong khoảng [0, .., 6].

Nếu bạn muốn khoảng thời gian là [1, .. 7], hãy sử dụng như sau:

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

... Hay cách khác:

df$day = df$day + 1

5
Bạn cũng có thể sử dụng đối số week_start:wday(df$date, label = TRUE, week_start = 1)
mrub

12

cái này cần phải dùng mẹo

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

bình luận mẫu của JStrahl format(as.Date(df$date),"%w"), chúng tôi nhận được số ngày hiện tại: as.numeric(format(as.Date("2016-05-09"),"%w"))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.