2017-04-22 9 views
1

あたり正しい週数を取得する:私はいくつかの計算を行っている。この出力に基づいて分割期日と私は週</strong>にこの年<strong>年に日付を分割し、次のコードでは年間

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年の52th週の一部が、あるため、分割の最初の:私は、この手順が完全に動作しないことに気づいたいくつかのデータをプロットして場合にのみ、 2012年12月31日に同じ問題が発生します。この日付は2013年の1週目の一部ですが、毎年別々に機能を適用するため2012年の第1週に割り当てられます。

毎年分割して毎年分けて週に分割すると、必要なフォーマットが得られますが、週と年の関係は正しくありません。私は週による最初の年よりも、分割することができ、正しい週数を取得するには、次の

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週)を持っている理由

です。ISO週ベースでdatesを分割する、しかし

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" 

を:

ので、若干の変更のOPのコードで期待通りに動作します年とISOの週はb

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を使用することができます:eは3つの多少異なる方法で一度にも達成しました:

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" 
関連する問題