从每日时间序列转换为每周时间序列时,R apply.weekly() 返回不正确的时间段

Posted

技术标签:

【中文标题】从每日时间序列转换为每周时间序列时,R apply.weekly() 返回不正确的时间段【英文标题】:R apply.weekly() returns incorrect period when converting from daily to weekly time-series 【发布时间】:2016-09-04 12:39:29 【问题描述】:

我正在处理时间序列数据并遇到apply.weekly() 的问题。似乎在某个日期之后,几周不能正确汇总。

library(xts)

value <-  c(46.40269, 47.27100 ,47.73311, 46.12858, 44.54989 ,42.79287, 41.70017 ,41.22373, 40.16180, 38.48705 ,37.02111 ,35.95312, 37.47187, 42.59649 ,49.22880, 53.96820, 57.97346, 61.22755,61.79824, 65.05720, 65.30233 ,61.86191,58.03687, 55.17815, 52.88933, 51.47876, 50.31402, 48.91674, 47.47042)
DATE <- as.Date(c("2038-01-03", "2038-01-04", "2038-01-05", "2038-01-06", "2038-01-07" ,"2038-01-08", "2038-01-09", "2038-01-10", "2038-01-11", "2038-01-12", "2038-01-13" ,"2038-01-14", "2038-01-15" ,"2038-01-16" ,"2038-01-17", "2038-01-18", "2038-01-19", "2038-01-20", "2038-01-21", "2038-01-22", "2038-01-23", "2038-01-24" ,"2038-01-25", "2038-01-26", "2038-01-27", "2038-01-28", "2038-01-29", "2038-01-30", "2038-01-31"))

DF <- data.frame(DATE, value)
DF_daily <- xts(DF$value, order.by = DF$DATE) 
DF_weekly <- apply.weekly(DF_daily, FUN=sum)

print(DF_weekly)

这会生成以下输出:

                [,1]
2038-01-03  46.40269
2038-01-10 311.39935
2038-01-16 231.69144
2038-01-31 840.70198

请注意最后期限是 15 天。现在,如果我改为使用 2010 年的日期,我得到的正是你所期望的。也就是说,使用

DATE <- as.Date(c("2010-01-03", "2010-01-04", "2010-01-05", "2010-01-06", "2010-01-07" ,"2010-01-08" ,"2010-01-09" ,"2010-01-10", "2010-01-11", "2010-01-12" ,"2010-01-13" ,"2010-01-14" ,"2010-01-15" ,"2010-01-16", "2010-01-17", "2010-01-18", "2010-01-19" ,"2010-01-20" ,"2010-01-21" ,"2010-01-22", "2010-01-23", "2010-01-24", "2010-01-25" ,"2010-01-26","2010-01-27" ,"2010-01-28" ,"2010-01-29" ,"2010-01-30", "2010-01-31"))

在上面的代码中生成输出:

                [,1]
2010-01-03  46.40269
2010-01-10 311.39935
2010-01-17 280.92024
2010-01-24 427.18889
2010-01-31 364.28429

我不知道 2038 年有什么奇怪的地方吗?

我在 64 位 Windows 7 Enterprise 上运行此代码,sessionInfo() 返回以下输出

R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] xts_0.9-7  zoo_1.7-12

loaded via a namespace (and not attached):
[1] tools_3.2.3     grid_3.2.3      lattice_0.20-33

【问题讨论】:

xkcd.com/607 千年虫问题有一个更模糊的变体,称为Year 2038 Problem,其中 Unix 纪元将在 2038 年 1 月 19 日溢出一个 32 位数字。 将日期转换为 POSIXlt 时间戳还有问题吗? 在 CRAN 上使用 xts 和 GitHub 上的开发版本在 64 位 Ubuntu 15.10 上使用 R-3.3.0 时,这两组日期都可以正常工作。请将您的sessionInfo 编辑成您的问题。 感谢您的周到回答。 @JoshuaUlrich,我现在添加了sessionInfo() 打印输出。阅读您的评论后,我更新了 R 但仍然遇到同样的问题。 @RogerFilmyer,使用 as.POSIXlt() 而不是 as.Date() 会产生相同的输出。另请注意,问题出在apply.weekly();即上面代码中的每日xts对象DF_daily正确显示日期。 【参考方案1】:

2038 年 1 月 19 日是一个特殊的日期:凌晨 3:14:08,32 位 unix 纪元(计算自 1970 年 1 月 1 日午夜以来的秒数)将溢出。处理时间戳时可能存在一个错误,导致该日期的计数器中断。许多数字存储为带符号的 32 位整数,最大值为 2,147,483,647。

这称为"Year 2038 Problem",类似于千年虫问题。

但是,R Date type is in the number of days, instead of the number of seconds,自 Unix 纪元以来。对我来说,这表明xts 包存在问题。

你不是唯一一个遇到这个问题的人 (here is a 2012 discussion on a mailing list),而且该错误似乎来自系统日期处理和 R 日期处理之间的错误切换。

【讨论】:

xts always 将索引存储为包含自纪元以来的秒数的双精度数,因此您猜测这是 xts 的问题不太可能是正确的。跨度>

以上是关于从每日时间序列转换为每周时间序列时,R apply.weekly() 返回不正确的时间段的主要内容,如果未能解决你的问题,请参考以下文章

R:将日期从每天转换为每周并绘制它们

通过 Python 中的 pandas 将每日库存数据转换为每周

如何将现实世界 5 天的每日股票数据转换为每周模式以获得每周移动平均线

将每日股票价格变成每周/每月/每季度/学期/每年?

Mysql 将给定日期范围内的每日总计转化为每周总计

将每日数据转换为每周数据并汇总 R 中的多个列