ค้นหาวันในสัปดาห์


215

สมมติว่าฉันมีวันที่ใน R และจัดรูปแบบดังนี้

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

มีวิธีใดใน R ที่จะเพิ่มคอลัมน์อื่นด้วยวันของสัปดาห์ที่เชื่อมโยงกับวันที่หรือไม่ ชุดข้อมูลมีขนาดใหญ่มากดังนั้นจึงไม่สมเหตุสมผลเลยที่จะต้องดำเนินการด้วยตนเองและทำการเปลี่ยนแปลง

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

ดังนั้นหลังจากเพิ่มวันมันจะจบลงด้วยลักษณะ:

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

เป็นไปได้ไหม ใครช่วยชี้แพคเกจที่จะอนุญาตให้ทำ เพียงแค่พยายามสร้างวันตามวันที่โดยอัตโนมัติ

คำตอบ:


298
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

แก้ไข:เพื่อแสดงอีกวิธีหนึ่ง ...

wdayส่วนประกอบของPOSIXltวัตถุเป็นวันทำงานที่เป็นตัวเลข (0-6 เริ่มต้นวันอาทิตย์)

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

ซึ่งคุณสามารถใช้เพื่อเซตเวกเตอร์อักขระของชื่อวันทำงาน

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

3
+1 มีวิธีใช้weekdaysในการรับจำนวนวันทำงานตามที่คุณใช้หรือas.POSIXltไม่?
Shambho

3
@Shambho setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]ผมคิดว่าคุณสามารถทำเช่นนี้: หากคุณไม่ชอบชื่อคุณสามารถunname()ล้อมรอบมันได้
GSee

6
ในการรับหมายเลขวันธรรมดา (0-6, Sun-Sat) นับจากวันที่คุณสามารถทำได้: จัดรูปแบบ (as.Date (df $ date), "% w") สำหรับรายละเอียดโค้ดรูปแบบดูที่stat.berkeley.edu/~s133/dates.html
JStrahl

65

เงยหน้าขึ้นมอง?strftime:

%A ชื่อวันทำงานเต็มในสถานที่ปัจจุบัน

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

15
ในกรณีที่มีคนค้นหาหมายเลขวันธรรมดาให้ใช้'%u'แทน'%A'
Vlad Holubiev

64

ใช้lubridateแพ็คเกจและฟังก์ชั่น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
สิ่งที่ดีเกี่ยวกับวิธีการนี้คือมันคืนค่าจำนวนวันเป็นปัจจัยดังนั้นหากคุณสร้างแผนภูมิวันจะอยู่ในลำดับที่ถูกต้อง
bobfet1

เพื่อให้ได้คำเต็มในแต่ละวัน (เช่นวันอาทิตย์แทนที่จะเป็นวันอาทิตย์):abbr = FALSE
สตีฟ

17

สมมติว่าคุณต้องการให้สัปดาห์เริ่มต้นในวันจันทร์ (แทนที่จะเป็นค่าเริ่มต้นในวันอาทิตย์) ดังนั้นสิ่งต่อไปนี้จะเป็นประโยชน์:

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

ผลลัพธ์คือวันในช่วง [0, .. , 6]

หากคุณต้องการให้ช่วงเวลาเป็น [1, .. 7] ให้ใช้คำสั่งต่อไปนี้:

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

... หรืออีกทางหนึ่ง:

df$day = df$day + 1

5
นอกจากนี้คุณยังสามารถใช้การโต้แย้งweek_start:wday(df$date, label = TRUE, week_start = 1)
mrub

12

สิ่งนี้ควรทำเคล็ดลับ

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

แบบฟอร์มแสดงความคิดเห็นของ JStrahl format(as.Date(df$date),"%w")เราได้รับจำนวนวันปัจจุบัน: as.numeric(format(as.Date("2016-05-09"),"%w"))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.