找到一周的一天

ATM*_*hew 200 r date r-faq

假设我在R中有一个日期,其格式如下.

   date      
2012-02-01 
2012-02-01
2012-02-02
Run Code Online (Sandbox Code Playgroud)

在R中是否有任何方法可以添加与日期相关的星期几的另一列?数据集非常大,因此手动完成并进行更改是没有意义的.

df = data.frame(date=c("2012-02-01", "2012-02-01", "2012-02-02")) 
Run Code Online (Sandbox Code Playgroud)

因此,在添加日期之后,它最终会看起来像:

   date       day
2012-02-01   Wednesday
2012-02-01   Wednesday
2012-02-02   Thursday
Run Code Online (Sandbox Code Playgroud)

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

GSe*_*See 281

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
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了表明另一种方式......

对象的wday组件POSIXlt是数字工作日(从星期日开始的0-6).

as.POSIXlt(df$date)$wday
## [1] 3 3 4
Run Code Online (Sandbox Code Playgroud)

您可以使用它来对工作日名称的字符向量进行子集化

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

  • 要从您可以执行的日期获得工作日编号(0-6,周日至周六):格式(as.Date(df $ date),"%w").有关格式代码的详细信息,请参阅http://www.stat.berkeley.edu/~s133/dates.html (5认同)
  • +1有没有办法使用`weekdays`来获取工作日的数量,因为你使用`as.POSIXlt` ?? (2认同)
  • @Shambho我想你可以这样做:`setNames(0:6,c("星期日","星期一","星期二","星期三","星期四","星期五","星期六"))[平日( as.Date(DF $日期))]`.如果你不喜欢这些名字,你可以在它周围包装`unname()`. (2认同)

nog*_*pes 62

查找?strftime:

%A 当前语言环境中的完整工作日名称

df$day = strftime(df$date,'%A')
Run Code Online (Sandbox Code Playgroud)

  • 如果有人搜索了工作日号码 - 请使用"%u"而不是"%A" (14认同)

And*_*rie 54

使用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
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的好处在于它将天数作为一个因子返回,因此如果您创建图表,则日期将按正确的顺序排列. (11认同)
  • 要获取每天的完整单词(例如星期日而不是 Sun): `abbr = FALSE` (3认同)

Pet*_*tig 17

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

require(lubridate)
df$day = ifelse(wday(df$time)==1,6,wday(df$time)-2)
Run Code Online (Sandbox Code Playgroud)

结果是区间[0,..,6]中的天数.

如果您希望间隔为[1,.. 7],请使用以下内容:

df$day = ifelse(wday(df$time)==1,7,wday(df$time)-1)
Run Code Online (Sandbox Code Playgroud)

......或者:

df$day = df$day + 1
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用参数`week_start`:`wday(df $ date,label = TRUE,week_start = 1)` (4认同)

Tyl*_*ker 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
Run Code Online (Sandbox Code Playgroud)


s_s*_*ary 8

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
Run Code Online (Sandbox Code Playgroud)