Haftanın gününü bul


215

Diyelim ki R'de bir tarihim var ve şu şekilde biçimlendirilmiş.

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

R'de, tarihle ilişkili haftanın gününü içeren başka bir sütun eklemenin bir yolu var mı? Veri kümesi gerçekten büyüktür, bu nedenle manuel olarak ilerlemek ve değişiklikleri yapmak mantıklı olmaz.

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

Günleri ekledikten sonra, sonuç olarak şöyle görünecektir:

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

Mümkün mü? Birisi beni bunu yapmama izin verecek bir pakete yönlendirebilir mi? Sadece günü tarihe göre otomatik olarak oluşturmaya çalışıyorum.

Yanıtlar:


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

Edit: Sadece başka bir yol göstermek için ...

wdayBir bileşen POSIXltnesne sayısal hafta içi (Pazar 0-6 başlangıç) 'dir.

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

hafta içi isimlerinin bir karakter vektörünü alt kümesi olarak kullanabileceğiniz

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

3
+1 weekdaysKullanarak hafta içi sayısını almak için kullanmanın bir yolu var mı as.POSIXlt??
Shambho

3
Sanırım @Shambho bunu yapabilirdi: setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]. İsimleri beğenmezseniz, unname()etrafına sarılabilirsiniz .
GSee

6
Yapabileceğiniz tarihten hafta içi sayısını (0-6, Paz-Cts) almak için: format (tarih olarak (df $ tarih), "% w"). Biçim kodu ayrıntıları için stat.berkeley.edu/~s133/dates.html
JStrahl

65

Yukarı bak ?strftime:

%A Geçerli yerel ayarda tam hafta içi adı

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

15
Birisi hafta içi bir numarayı aradığında - '%u'bunun yerine kullanın'%A'
Vlad Holubiev

64

lubridatePaketi ve işlevi kullanın 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
Bu yaklaşımla ilgili iyi olan şey, günleri bir faktör olarak döndürmesidir, bu nedenle bir grafik oluşturursanız günler doğru sırada olacaktır.
bobfet1

Her gün için tam kelimeyi almak (örneğin Sun yerine Pazar):abbr = FALSE
stevec

17

Diyelim ki haftanın Pazartesi günü (Pazar günü varsayılan yerine) başlamasını istediğinizi varsayalım :

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

Sonuç [0, .., 6] aralığındaki günlerdir.

Aralığın [1, .. 7] olmasını istiyorsanız, aşağıdakileri kullanın:

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

... Veya alternatif olarak:

df$day = df$day + 1

5
Ayrıca şu argümanı da kullanabilirsiniz week_start:wday(df$date, label = TRUE, week_start = 1)
20'de mrub

12

Bu hile yapmalı

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 form yorum format(as.Date(df$date),"%w"), biz bugünün sayısını almak: as.numeric(format(as.Date("2016-05-09"),"%w"))

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.