查找一周中的哪一天
Posted
技术标签:
【中文标题】查找一周中的哪一天【英文标题】: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
这可能吗?谁能指点我一个允许我这样做的包? 只是想按日期自动生成日期。
【问题讨论】:
【参考方案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"))
【讨论】:
以上是关于查找一周中的哪一天的主要内容,如果未能解决你的问题,请参考以下文章
SQL查询,用于在一周中的每一天为项目排序的EACH类别中查找UNITS