2013-08-21 33 views
0

我試圖讓每一個特定的星期的第一週,數,即1,2,第二等Lubridate week()給了我'錯誤的一週,可能的TZ問題?

與2012年1月1日我的數據開始,在假設所有的日期/次數與芝加哥/ CST6CDT時區有關。馬上開始,我似乎遇到了一個問題(無論是我的理解還是編程)都得到了星期功能,給我我需要的東西。

例如...

x=seq(as.POSIXlt("2012-1-1"), as.POSIXlt("2012-1-10"), by="day") 
cbind(as.character(x), week(x)) 

......給我......

 [,1]   [,2] 
[1,] "2012-01-01" "1" 
[2,] "2012-01-02" "1" 
[3,] "2012-01-03" "1" 
[4,] "2012-01-04" "1" 
[5,] "2012-01-05" "1" 
[6,] "2012-01-06" "1" 
[7,] "2012-01-07" "2" 
[8,] "2012-01-08" "2" 
[9,] "2012-01-09" "2" 
[10,] "2012-01-10" "2" 

2012年1月7日,星期六,應被視爲第1周的一部分,右?設置時區似乎沒有幫助。

x=seq(as.POSIXlt("2012-1-1", tz="CST6CDT"), as.POSIXlt("2012-1-10", tz="CST6CDT"), by="day") 

有沒有辦法解決這個問題?

+0

是否使用ISO周有任何機會?那些有一些反直覺的規則。 http://en.wikipedia.org/wiki/ISO_week_date –

+0

它與函數'week'本身有關。請參閱我的回答。謝謝。 – Mayou

回答

2

這有做的功能week寫在包裝方式:

> week() 
function (x) 
yday(x)%/%7 + 1 

在你的情況下,於2012年1月7日:

x = as.POSIXlt("2012-1-7") 
yday(x) = 1 

然後:

week(x) = (1%/%7) + 1 = 2 

爲了讓它按照你的意願工作,試試這個

x=seq(as.POSIXlt("2012-1-1", tz = "UCT"), as.POSIXlt("2012-1-20", tz = "UTC"), by="day") 
cbind(as.character(x), (yday(x)-1)%/%7+1) 

會得到以下的輸出:

#  [,1]   [,2] 
# [1,] "2012-01-01" "1" 
# [2,] "2012-01-02" "1" 
# [3,] "2012-01-03" "1" 
# [4,] "2012-01-04" "1" 
# [5,] "2012-01-05" "1" 
# [6,] "2012-01-06" "1" 
# [7,] "2012-01-07" "1" <<< 
# [8,] "2012-01-08" "2" 
# [9,] "2012-01-09" "2" 
#[10,] "2012-01-10" "2" 
#[11,] "2012-01-11" "2" 
#[12,] "2012-01-12" "2" 
#[13,] "2012-01-13" "2" 
#[14,] "2012-01-14" "2" 
#[15,] "2012-01-15" "3" 
#[16,] "2012-01-16" "3" 
#[17,] "2012-01-17" "3" 
#[18,] "2012-01-18" "3" 
#[19,] "2012-01-19" "3" 
#[20,] "2012-01-20" "3" 
1

你想要什麼可能是isoweek(),不week()。我總是有與我的日曆周:)相同的問題:)

相關問題