2016-05-09 2 views
2

Я работаю с данными временных рядов и испытываю проблему с apply.weekly(). Похоже, что через определенную дату недели не будут агрегироваться правильно.R 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 
+1

https://xkcd.com/607/ –

+0

Существует несколько более неясный вариант проблем, связанных с Y2K, который называется [проблема 2038 года] (https://en.wikipedia.org/wiki/Year_2038_problem), где Unix Epoch переполнит 32-разрядное число 19 января 2038 года. –

+0

действительно ли имеет время для преобразования дат в POSIXlt? –

ответ

0

19 января, 2038 особая дата: В 3:14:08 AM, 32-разрядный Unix-эпоха (отсчет количества секунд с полуночи, 1 января 1970 г.) будет переполняться. Возможно, есть ошибка при обработке временных меток, которые вызывают встречный прорыв в эту дату. Многие числа хранятся как подписанные 32-битные целые числа, которые имеют максимальное значение 2 147 483 647.

Это называется "Year 2038 Problem", аналогично проблеме Y2K.

Однако 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.

+1

xts * always * хранит индекс как двойной, содержащий количество секунд с эпохи, поэтому ваше предположение, что это проблема с xts, вряд ли будет правильным. –

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