2015-10-20 2 views
-1

Примечание: Я повторил предыдущий вопрос, как сказано в комментариях.Преобразование временных рядов данных из секунд в почасовое означает в R

Я использую три разных пакета, то есть dplyr, data.table и xts для агрегирования моих секундных данных в среднечасовое представление. Но, к моему удивлению, xts ведет себя по-другому по сравнению с другими двумя. Проблемы с XTS являются:

  • Результатов в одно дополнительном наблюдении по сравнению с другими двумя
  • среднечасовым рассчитывается полностью отличаются от двух других

Здесь есть сгущенный код для целей тестирования:

library(xts) 
library(data.table) 
library(dplyr) 
t2 <- as.POSIXct(seq(from = 1438367408, to = 1440959383, by = 30), origin = "1970-01-01") 
dframe <- data.frame(timestamp=t2, power=rnorm(length(t2))) 
#using xts 
x <- xts(dframe$power,dframe$timestamp) 
h1 <- period.apply(x, endpoints(x, "hours"), mean) 
h1 <- data.frame(timestamp=trunc(index(h1),'hours'), power=coredata(h1)) 
#using data.table 
h2 <- setDT(dframe)[, list(power= mean(power)) ,(timestamp= as.POSIXct(cut(timestamp, 'hours')))] 
#using dpylr 
h3 <- dframe %>% group_by(timestamp= as.POSIXct(cut(timestamp, 'hour'))) %>% summarise(power=mean(power)) 

Выходы в отношении размера:

> dim(h1) 
[1] 721 2 
> dim(h2) 
[1] 720 2 
> dim(h3) 
[1] 720 2 

Мероприятие в отношении почасовых средств:

> head(h1) 
      timestamp  power 
1 2015-08-01 00:00:00 0.04485894 
2 2015-08-01 01:00:00 -0.02299071 
> head(h2) # equals to head(h2) 
      timestamp  power 
1: 2015-08-01 00:00:00 0.10057538 
2: 2015-08-01 01:00:00 -0.07456292 

Дополнительного наблюдения в случае h1:

> tail(h1) 
       timestamp  power 
719 2015-08-30 22:00:00 0.069544538 
720 2015-08-30 23:00:00 0.011673835 
721 2015-08-30 23:00:00 -0.053858563 

Ясно в течение последнего часа дня есть два наблюдения. Обычно должно быть только одно.

Моя система информации:

> sessionInfo() 
R version 3.2.2 (2015-08-14) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.10.3 (Yosemite) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

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

other attached packages: 
[1] dplyr_0.4.3  data.table_1.9.7 xts_0.9-7  zoo_1.7-12  

loaded via a namespace (and not attached): 
[1] lazyeval_0.1.10 magrittr_1.5 R6_2.1.1  assertthat_0.1 parallel_3.2.2 DBI_0.3.1  tools_3.2.2  
[8] Rcpp_0.12.1  grid_3.2.2  chron_2.3-47 lattice_0.20-33 

Примечание:

  • Оригинальный набор данных можно найти на link
  • Я хочу, чтобы решение этой проблемы, потому что в моих XTS сценариев реализации почти 35 раз быстрее, чем остальные два
+0

Просьба сделать это воспроизводимым. –

+0

Я представил как код, так и набор данных. Что еще мне нужно, чтобы сделать его воспроизводимым –

+0

Извините, но я не хочу нажимать на неизвестную ссылку. –

ответ

2

Похоже, что это может быть ошибка в endpoints, потому что ваш часовой пояс не полный час с UTC. Я могу повторить проблему, если я установил свой местный часовой пояс для вас.

R> Sys.setenv(TZ="Asia/Kolkata") 
R> x <- xts(dframe$power,dframe$timestamp) 
R> h <- period.apply(x, endpoints(x, "hours"), mean) 
R> head(h) 
         [,1] 
2015-08-01 00:29:31 124.9055 
2015-08-01 01:29:31 129.7197 
2015-08-01 02:29:31 139.0899 
2015-08-01 03:29:32 145.6592 
2015-08-01 04:29:32 153.6840 
2015-08-01 05:29:32 114.4809 

Обратите внимание, что конечные точки работают с шагом в полчаса, а не в конце часа. Это связано с тем, что Азия/Калькутта - это UTC + 0530, а endpoints выполняет все свои расчеты по времени, указанному в UTC.

Вы можете избежать этого, указав часовой пояс для объекта POSIXct в UTC.

require(xts) 
require(dplyr) 
require(data.table) 
Sys.setenv(TZ="Asia/Kolkata") 

dframe <- read.csv("~/ap601.csv",head=TRUE,sep=",") 
# set timezone on POSIXct object 
dframe$timestamp <- as.POSIXct(dframe$timestamp, tz="UTC") 

#using xts 
x <- xts(dframe$power, dframe$timestamp) 
h <- period.apply(x, endpoints(x, "hours"), mean) 
h1 <- data.frame(timestamp=trunc(index(h),'hours'), power=coredata(h)) 
# using data.table 
h2 <- setDT(dframe)[, list(power= mean(power)) ,(timestamp= cut(timestamp, 'hour'))] 
# using dplyr 
h3 <- dframe %>% group_by(timestamp= cut(timestamp, 'hour')) %>% summarise(power=mean(power)) 

all.equal(h1$power, h2$power) # TRUE 
all.equal(h1$power, h3$power) # TRUE 

Вот обходные, чтобы получить те же результаты, без установки часового пояса для столбца POSIXct к UTC. Обратите внимание, что это может не работать для часовых поясов с летним временем ожидания (Asia/Kolkata не соблюдает никакого DST).

В принципе, идея состоит в том, чтобы вычесть полчаса с местного времени при расчете endpoints, так что основное время UTC выравнивается в час.

dframe <- read.csv("~/ap601.csv",head=TRUE,sep=",") 
dframe$timestamp <- as.POSIXct(dframe$timestamp) 

# subtract half an hour from the index when calculating endpoints 
h <- period.apply(x, endpoints(index(x)-3600*0.5, 'hours'), mean) 
h1 <- data.frame(timestamp=trunc(index(h),'hours'), power=coredata(h)) 
all.equal(h1$power, h2$power) # TRUE 
all.equal(h1$power, h3$power) # TRUE 
+0

Спасибо Джошуа за то, что он указал на первопричину. Но я не могу идти с UTC, потому что все мои данные хранятся в часовом поясе «Азия/Калькутта». Если я поеду с UTC, то он сдвинет мои данные за разницу в часовом поясе в 0530 часов. –

+0

Я пробовал использовать «endpoints (x,« minutes », 90)», но кажется, что он работает неправильно. Есть ли еще какое-то другое исправление, кроме временного сдвига UTC? –

+0

@HaroonRashid: Смотрите мое редактирование. Это также должно работать и не изменяет часовой пояс в объекте 'dframe'. –

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

  • Нет связанных вопросов^_^