2012-02-09 84 views
152

Giả sử tôi có ngày tháng trong R và được định dạng như sau.Tìm ngày trong tuần

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

Có cách nào trong R để thêm cột khác với ngày trong tuần được kết hợp với ngày không? Tập 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ẽ kết thúc tìm kiếm như:

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

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

Trả lời

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 

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

Thành phần wday của đối tượng POSIXlt là số ngày trong tuần (0-6 bắt đầu từ Chủ Nhật).

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

mà bạn có thể sử dụng để tập hợp con một vector đặc trưng của tên các ngày trong tuần

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

+1 Có cách nào để sử dụng 'các ngày trong tuần 'để lấy số ngày trong tuần khi bạn sử dụng' as.POSIXlt' ?? – Shambho

+2

@Shambho Tôi đoán bạn có thể làm điều này: 'setNames (0: 6, c (" Chủ Nhật "," Thứ Hai "," Thứ Ba "," Thứ Tư "," Thứ Năm "," Thứ Sáu "," Thứ Bảy ")) [các ngày trong tuần (as.Date (df $ date))] '. Nếu bạn không thích tên, bạn có thể quấn 'unname()' xung quanh nó. – GSee

+4

Để lấy số ngày trong tuần (0-6, CN-Sat) 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 http://www.stat.berkeley.edu/~s133/dates.html – JStrahl

50

Tra cứu ?strftime:

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

Trong trường hợp ai đó tìm kiếm một ngày trong tuần tê liệt er - sử dụng ''% u'' thay vì''% A'' –

+0

Cách tốt hơn câu trả lời hàng đầu. Ngắn và rõ ràng. – wordsforthewise

33

Sử dụng lubridate gó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 
+7

Điều tốt về phương pháp này là nó trả về những ngày như là một yếu tố, vì vậy nếu bạn tạo ra một biểu đồ những ngày sẽ được theo thứ tự đúng. – bobfet1

10

này nên làm các trick

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

Hãy nói rằng bạn bổ sung muốn tuần để bắt đầu trên thứ hai (thay vì mặc định vào ngày chủ nhật), thì sau đây hữu ích:

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

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

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

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

... hoặc, cách khác:

df$day = df$day + 1 
1

hình thức bình luận 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"))

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 
Các vấn đề liên quan