我最近在R中处理日期时遇到问题。2015年的最后一天(2015-12-31)是星期四,这意味着如果我将星期日视为一周的开始日期,则该年的最后一周仅包含5天。现在,我希望将周五和周六的2016-01-01和2016-01-02与第53周相关联,并将2016年1月1日的第1周开始于周日。
require(lubridate)
range <- seq(as.Date('2015-12-26'), by = 1, len = 10)
df <- data.frame(range)
df$WKN <- as.numeric(strftime(df$range, format = "%U")) + 1
df$weekday <- weekdays(df$range)
df$weeknum <- wday(df$range)
这将给我以下结果:
df:
range WKN weekday weeknum
2015-12-26 52 Saturday 7
2015-12-27 53 Sunday 1
2015-12-28 53 Monday 2
2015-12-29 53 Tuesday 3
2015-12-30 53 Wednesday 4
2015-12-31 53 Thursday 5
2016-01-01 1 Friday 6
2016-01-02 1 Saturday 7
2016-01-03 2 Sunday 1
2016-01-04 2 Monday 2
现在,我希望将数据框如下:
df:
range WKN weekday weeknum
2015-12-26 52 Saturday 7
2015-12-27 53 Sunday 1
2015-12-28 53 Monday 2
2015-12-29 53 Tuesday 3
2015-12-30 53 Wednesday 4
2015-12-31 53 Thursday 5
2016-01-01 53 Friday 6
2016-01-02 53 Saturday 7
2016-01-03 1 Sunday 1
2016-01-04 1 Monday 2
谁能指出我要自动化的方向,这样我就不必每年更改代码了?
如果您结帐?strptime
,则可以使用几种不同的星期编号令牌format
。%V
除了星期一从星期几开始,这里几乎可以正常工作,因此添加一个进行调整:
df$WKN <- as.integer(format(df$range + 1, '%V'))
df
## range WKN weekday weeknum
## 1 2015-12-26 52 Saturday 7
## 2 2015-12-27 53 Sunday 1
## 3 2015-12-28 53 Monday 2
## 4 2015-12-29 53 Tuesday 3
## 5 2015-12-30 53 Wednesday 4
## 6 2015-12-31 53 Thursday 5
## 7 2016-01-01 53 Friday 6
## 8 2016-01-02 53 Saturday 7
## 9 2016-01-03 1 Sunday 1
## 10 2016-01-04 1 Monday 2
或者,如果您按照标签所示使用dplyr,
library(dplyr)
df %>% mutate(WKN = as.integer(format(range + 1, '%V')))
返回相同的东西。isoweek
lubridate的功能是等效的,因此您也可以
library(lubridate)
df$WKN <- isoweek(df$range + 1)
或者
df %>% mutate(WKN = isoweek(range + 1))
两者都返回与as.integer(format(...))
版本相同的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句