2013-08-21 2 views
0

Я пытаюсь получить число каждой конкретной недели, то есть 1 за первую неделю, 2 для второго и т. Д.Lubridate week() дает мне «неправильную» неделю, возможную проблему TZ?

Мои данные начинаются с 1 января 2012 года и при условии, что все даты/времени имеют отношение к часовому поясу Chicago/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" 

7 января 2012, в субботу, следует рассматривать как часть 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 

В вашем случае, 7 января 2012 года:

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(). У меня такие же проблемы всегда с моими календарными неделями :)

Смежные вопросы