2012-02-09 103 views
152

假設我在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 

這可能嗎?任何人都可以指向我的包,這將允許我這樣做? 只是試圖自動生成日期的日期。

回答

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 

編輯:只是爲了展示另一種方式......

一個POSIXlt對象的wday組件是數字平日(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" 
+2

+1有沒有辦法像使用'as.POSIXlt'一樣使用'weekdays'來獲取週日數? – Shambho 2014-06-04 17:40:25

+2

@Shambho我猜你可以這樣做:'setNames(0:6,c(「星期天」,「星期一」,「星期二」,「星期三」,「星期四」,「星期五」,「星期六」)) (as.Date(DF $日期))]'。如果你不喜歡這些名字,你可以在它周圍包裝'unname()'。 – GSee 2014-06-04 22:21:56

+4

要從您可以執行的日期獲得週日數(0-6,Sun-Sat):format(as.Date(df $ date),「%w」)。有關格式代碼的詳細信息,請參閱http://www.stat.berkeley.edu/~s133/dates.html – JStrahl 2015-04-24 22:44:48

50

查找?strftime

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

如果有人搜索平日麻木呃 - 使用''%u''而不是''%A'' – 2015-12-15 16:51:35

+0

比頂級答案更好。簡短明瞭。 – wordsforthewise 2017-09-26 05:04:50

33

使用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 
+7

這種方法的好處是將日期作爲一個因素返回,因此如果您創建圖表,日期將按正確的順序進行。 – bobfet1 2013-05-06 19:03:20

10

這應該做的伎倆

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

比方說,你還希望下週開始對週一(而不是在週日默認值),那麼以下有幫助:

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) 

...,或者:JStrahl format(as.Date(df$date),"%w")

df$day = df$day + 1 
1

形式評論,我們得到當天的號碼: 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