【问题标题】:Find the day of a week查找一周中的哪一天
【发布时间】:2012-03-02 05:38:32
【问题描述】:

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


    【解决方案1】:
    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" 
    

    【讨论】:

    • +1 有没有办法像使用as.POSIXlt 一样使用weekdays 来获取工作日数??
    • @Shambho 我猜你可以这样做:setNames(0:6, c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))[weekdays(as.Date(df$date))]。如果你不喜欢这些名字,你可以用unname() 包裹它。
    • 要从日期获取工作日编号(0-6,Sun-Sat),您可以执行以下操作: format(as.Date(df$date),"%w") 。格式代码详情见stat.berkeley.edu/~s133/dates.html
    【解决方案2】:

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

    【讨论】:

    • 这种方法的好处是它将天数作为一个因素返回,因此如果您创建图表,天数将按正确的顺序排列。
    • 获取每天的完整单词(例如,星期日而不是星期日):abbr = FALSE
    【解决方案3】:

    查找?strftime

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

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

    【讨论】:

    • 如果有人搜索工作日号码 - 使用 '%u' 而不是 '%A'
    • 如果你想要星期几的数字,不要忘记使用原始的 Date 对象,而不是 strftime 结果,因为它是字符类型
    【解决方案4】:

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

    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
    

    【讨论】:

    • 也可以使用参数week_start:wday(df$date, label = TRUE, week_start = 1)
    【解决方案5】:

    这应该可以解决问题

    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
      

      【讨论】:

        【解决方案7】:

        表单评论 JStrahl format(as.Date(df$date),"%w"),我们得到当天的数字: as.numeric(format(as.Date("2016-05-09"),"%w"))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          相关资源
          最近更新 更多