2017-04-22 95 views
1

用下面的代碼我分裂日期,年裂棗,這幾年到周按年份和周,今後每年正確的週數

library(lubridate) 

start = as.Date('2002-01-01') 
end = as.Date('2017-01-01') 

dates = sample(seq(as.Date('2002-01-01 00:00:00'), as.Date('2017-04-01 00:00:00'), by="day"), end-start,replace = FALSE) 

splitByYears = split(dates, year(dates)) 
splitYearsByWeeks = lapply(splitByYears, function(x) split(x, isoweek(x))) 

在此基礎上輸出我做了幾個計算。只有當我正在策劃一些數據,我注意到,這個過程並不完美:

>splitYearsByWeeks 
... 

$`2011`$`52` 
[1] "2011-01-01" "2011-01-02" "2011-12-26" 


$`2012` 
$`2012`$`1` 
[1] "2012-12-31" "2012-01-02" "2012-01-06" "2012-01-08" 

... 

這裏2011-01-01 2011-01-02和2010年第52周的一部分,但由於拆分的第一日期分配到2011年第52周。同樣的問題出現在2012年12月31日,這個日期是2013年第一週的一部分,但分配到2012年的第一週,因爲我每年單獨應用該功能。

按年份拆分並且每年拆分成幾周給我我需要的格式,但是週年關係不可能是正確的。爲了得到正確的週數,我可以先通過一週,比去年拆分

splitByWeek = split(dates, isoweek(dates)) 
splitWeeksByYear = lapply(splitByWeek, function(x) split(x, year(x))) 

但格式不正是我需要:

>splitWeeksByYear 
... 
$`53` 
$`53`$`2004` 
[1] "2004-12-31" "2004-12-29" "2004-12-28" 

$`53`$`2005` 
[1] "2005-01-01" 

$`53`$`2009` 
[1] "2009-12-28" 

$`53`$`2015` 
[1] "2015-12-30" 

$`53`$`2016` 
[1] "2016-01-03" 

什麼是獲得的最好辦法正確的星期在我需要的格式:$ year $ weekNum? (也許轉換第二個結果或完成其他方式嗎?)

+0

'格式(日期,「%Y-%U」)'? –

回答

0

根據ISO 8601的星期編號有一個好處,即ISO周總是包含7天沒有重疊或缺口(而不是美國和英國周編號約定)。

但是,新年前後的幾天可能屬於除日曆日期年以外的其他ISO週年的ISO周。

這就是爲什麼lubridateisoyear()isoweek()功能和format()識別的格式說明%G%g(ISO基於本週年),和%V(ISO周)。

因此,有輕微的修改OP的代碼按預期工作:

library(lubridate) 
splitByYears = split(dates, isoyear(dates)) 
splitYearsByWeeks = lapply(splitByYears, function(x) split(x, isoweek(x))) 
splitYearsByWeeks$`2011`$`52` 
[1] "2011-12-28" "2011-12-27" "2011-12-29" "2011-12-31" "2012-01-01" "2011-12-30" 
[7] "2011-12-26" 
splitYearsByWeeks$`2012`$`1` 
[1] "2012-01-03" "2012-01-07" "2012-01-06" "2012-01-04" "2012-01-08" "2012-01-05" 
[7] "2012-01-02" 

然而,通過基於周ISO分裂dates年和ISO周可以b E也達到一氣呵成三個略有不同的方式:

splitted <- split(dates, format(dates, "%G-W%V")) 
splitted$`2011-W52` 
[1] "2011-12-28" "2011-12-27" "2011-12-29" "2011-12-31" "2012-01-01" "2011-12-30" 
[7] "2011-12-26" 
splitted$`2012-W01` 
[1] "2012-01-03" "2012-01-07" "2012-01-06" "2012-01-04" "2012-01-08" "2012-01-05" 
[7] "2012-01-02" 

或者,你可以使用它的ISOweek package我是作者:

splitted <- split(dates, ISOweek::ISOweek(dates)) 

split()函數還接受在這種情況下,它們的相互作用是用於分組的因素的列表:

library(lubridate) 
splitted <- split(dates, list(isoyear(dates), isoweek(dates))) 
splitted$`2011.52` 
[1] "2011-12-28" "2011-12-27" "2011-12-29" "2011-12-31" "2012-01-01" "2011-12-30" 
[7] "2011-12-26" 
splitted$`2012.1` 
[1] "2012-01-03" "2012-01-07" "2012-01-06" "2012-01-04" "2012-01-08" "2012-01-05" 
[7] "2012-01-02"