查找星期几

Find the day of a week

提问人:ATMathew 提问时间:2/10/2012 最后编辑:HenrikATMathew 更新时间:7/8/2018 访问量:296724

问:

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

这可能吗?任何人都可以向我指出一个允许我这样做的软件包吗? 只是尝试按日期自动生成日期。

日期 R-常见问题

答:

78赞 nograpes 2/10/2012 #1

㚧:?strftime

%A当前区域设置中的完整工作日名称

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

评论

21赞 Vlad Holubiev 12/16/2015
如果有人搜索工作日号码 - 使用而不是'%u''%A'
0赞 FLonLon 2/8/2021
如果您想要一周中的数字日期,请不要忘记使用原始的 Date 对象,而不是 strftime 结果,因为它是字符类型
97赞 Andrie 2/10/2012 #2

使用包和功能:lubridatewday

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

评论

14赞 bobfet1 5/7/2013
这种方法的好处是它返回天数作为因子,因此,如果您创建图表,天数将按正确的顺序排列。
3赞 stevec 4/21/2020
要获取每天的完整单词(例如,星期日而不是星期日):abbr = FALSE
14赞 Tyler Rinker 2/10/2012 #3

这应该可以解决问题

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
362赞 GSee 2/10/2012 #4
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

编辑:只是为了展示另一种方式......

对象的组成部分是数字工作日(从星期日开始的 0-6)。wdayPOSIXlt

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赞 Shambho 6/5/2014
+1 有没有办法像使用 ??weekdaysas.POSIXlt
3赞 GSee 6/5/2014
@Shambho我想你可以这样做:.如果你不喜欢这些名字,你可以把它包起来。setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]unname()
6赞 JStrahl 4/25/2015
要从日期开始获取工作日号码(0-6,周日-周六),您可以执行以下操作:format(as.日期(df$date),“%w”) 。有关格式代码的详细信息,请参阅 stat.berkeley.edu/~s133/dates.html
18赞 Peter Lustig 3/21/2014 #5

假设您还希望一周从星期一开始(而不是默认的星期日),那么以下内容会有所帮助:

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

评论

7赞 mrub 5/24/2018
您还可以使用参数:week_startwday(df$date, label = TRUE, week_start = 1)
4赞 Qbik 5/9/2016 #6

JStrahl 的表单注释,我们得到当天的编号:format(as.Date(df$date),"%w")as.numeric(format(as.Date("2016-05-09"),"%w"))

10赞 s_scolary 9/28/2017 #7
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