a

Câu hỏi Tìm ngày trong tuần


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 đượ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 như sau:

   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 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.


164
2018-02-09 17:54


gốc




Các câu trả lời:


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 thể hiện một cách khác ...

Các wday thành phần của một POSIXlt đối tượng 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 một vector ký tự của tên ngày trong tuần

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

237
2018-02-09 18:06



+1 Có cách nào để sử dụng không weekdays để có được số ngày trong tuần khi bạn sử dụng as.POSIXlt?? - Shambho
@ 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ể bọc unname() xung quanh nó. - GSee
Để có được số ngày trong tuần (0-6, Sun-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 stat.berkeley.edu/~s133/dates.html - JStrahl


Tra cứu ?strftime:

%A Tên ngày trong tuần đầy đủ ở ngôn ngữ hiện tại

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

55
2018-02-09 17:58



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


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

37
2018-02-09 17:58



Đ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


Giả sử bạn muốn tuần bắt đầu Thứ hai (thay vì mặc định vào Chủ nhật), sau đó là hữu ích:

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

Kết quả là các 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

16
2018-03-20 20:54



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


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

11
2018-02-09 18:06





nhận xét của JStrahl format(as.Date(df$date),"%w"), chúng tôi lấy số ngày hiện tại: as.numeric(format(as.Date("2016-05-09"),"%w"))


2
2018-05-09 13:04





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

1
2017-09-28 14:38