XTS to.weekly returns different weekly endpoints

喜你入骨 提交于 2019-12-14 04:18:57

问题


I have a problem where the endpoints() function in xts (and also the to.weekly function, which uses endpoints) sometimes returns Friday as the end of week, and sometimes returns Monday.

My dataset is called sp2.

> head(sp2)
           [,1]
2012-01-09 1.78
2012-01-10 1.78
2012-01-11 1.77
2012-01-12 1.80
2012-01-13 1.77
2012-01-16 1.77

> tail(sp2)
           [,1]
2012-06-28 1.94
2012-06-29 1.92
2012-07-02 1.92
2012-07-03 1.90
2012-07-04 1.89
2012-07-05 1.89

> class(sp2)
[1] "xts" "zoo"

> weekdays(index(sp2))
  [1] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [11] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [21] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [31] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [41] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [51] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [61] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [71] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [81] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
 [91] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
[101] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
[111] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"   
[121] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Monday"    "Tuesday"   "Wednesday" "Thursday" 

So as you can see there are no missing weekdays in the data series.

Yet.....

> weekdays(index(to.weekly(sp2)))
 [1] "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Monday"  
[12] "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"  
[23] "Monday"   "Monday"   "Monday"   "Thursday"

Surely this should always be Friday (except for the last point which is today, Thursday)?

What am I doing wrong here, and is there a workaround?

I wish to compute weekly changes on this data series from Friday to Friday.

..........................................REPRODUCIBLE EXAMPLE ........................

i <- as.Date((as.numeric(Sys.Date())-200):as.numeric(Sys.Date()))
x <- xts(rep(1, length(i)), order.by = i)
weekdays(index(to.weekly(x)))
#  [1] "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"  
# [14] "Sunday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"   "Monday"  
# [27] "Monday"   "Monday"   "Monday"   "Thursday"
y <- xts(rep(1, length(i)), order.by = as.POSIXct(i))
weekdays(index(to.weekly(y)))
# [1] "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"  
# [14] "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"   "Sunday"  
# [27] "Sunday"   "Sunday"   "Sunday"   "Thursday"

回答1:


This is a bug in the CRAN version that has been fixed on R-Forge. Basically, the time component of the index wasn't being dropped and you ran into some funky business with timezones and daylight saving time.

Install from R-Forge to use the corrected function.

require(xts)
i <- Sys.Date()+200:0
x <- xts(rep(1, length(i)), order.by = i)
y <- xts(rep(1, length(i)), order.by = as.POSIXct(i))
all.equal(weekdays(index(to.weekly(x))), weekdays(index(to.weekly(y))))


来源:https://stackoverflow.com/questions/11347081/xts-to-weekly-returns-different-weekly-endpoints

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!