एक सप्ताह का दिन खोजें


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

क्या यह संभव है? क्या कोई मुझे एक पैकेज की ओर इशारा कर सकता है जो मुझे ऐसा करने की अनुमति देगा? बस तारीख द्वारा दिन को स्वचालित रूप से उत्पन्न करने की कोशिश कर रहा है।

जवाबों:


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

संपादित करें: बस एक और रास्ता दिखाने के लिए ...

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??
शम्भो

3
@ शंभो मुझे लगता है कि आप ऐसा कर सकते हैं setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]:। यदि आपको नाम पसंद नहीं हैं, तो आप इसके unname()चारों ओर लपेट सकते हैं ।
जीएसआई

6
कार्यदिवस की संख्या (0-6, सूर्य-शनि) को उस तिथि से प्राप्त करने के लिए जो आप कर सकते हैं: प्रारूप (as.Date (df $ date), "% w")। प्रारूप कोड विवरण के लिए stat.berkeley.edu/~s133/dates.html
JStrahl

65

ऊपर देखो ?strftime:

%A वर्तमान लोकल में पूरे सप्ताह का नाम

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

15
मामले में किसी ने एक सप्ताह के दिनों की संख्या की खोज '%u'की'%A'
व्लादि होलुबिएव

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 19

प्रत्येक दिन के लिए पूर्ण शब्द प्राप्त करने के लिए (जैसे सूर्य के बजाय रविवार):abbr = FALSE
stevec

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)
'20

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

जेएसट्रेल की टिप्पणी के रूप में format(as.Date(df$date),"%w"), हमें वर्तमान दिन की संख्या मिलती है: as.numeric(format(as.Date("2016-05-09"),"%w"))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.