2015-10-19 1 views
4

У меня есть файл данных, содержащий отсчеты, отснятые с длительностью 30 секунд. организация Файл:Преобразование данных интервала секунд в среднечасовое представление в МЕНЬШЕ ВРЕМЕНИ

> head(dframe) 
      timestamp power 
1 2015-08-01 00:00:04 584.1379 
2 2015-08-01 00:00:34 585.8087 
3 2015-08-01 00:01:04 584.9335 
4 2015-08-01 00:01:34 584.4366 
5 2015-08-01 00:02:04 584.2829 

Теперь, чтобы представить 30-секундные данные продолжительности в среднечасовыми я использую следующую команду R:

df = aggregate(list(power=dframe$power),by=list(timestamp=cut(as.POSIXct(dframe$timestamp),"hour")),mean) 

Это отлично работает. Но актуальная проблема связана со временем, которое требуется для больших файлов (данные одного года). Могу ли я как-то сократить время, необходимое для процесса конверсии? Другими словами, есть ли другая лучшая альтернатива, которая занимает меньше времени для преобразования секундных данных в среднечасовые данные в R?

ОБНОВЛЕНИЕ: Я использовал 4 разных метода для той же проблемы, что предложил @akrun и @Joshua. Для других пользователей переполнения стека здесь я обеспечиваю использование всех методов и соответствующее время, затрачиваемое

dframe<-read.csv(path,head=TRUE,sep=",") 
dframe$timestamp<- as.POSIXct(dframe$timestamp) 
xframe = dframe 
#using aggregate 
system.time(
df1<- aggregate(list(power=dframe$power),by=list(timestamp=cut(dframe$timestamp,"hour")),mean) 
) 
# using data.table 
system.time(
dfx<-setDT(dframe)[, list(power= mean(power)) ,(timestamp= cut(timestamp, 'hour'))] 
) 
# using dplyr 
system.time( 
xframe %>% group_by(timestamp= cut(timestamp, 'hour')) %>% summarise(power=mean(power)) 
) 
#using xts 
system.time({ 
    x <- xts(dframe$power,dframe$timestamp) 
    h <- period.apply(x, endpoints(x, "hours"), mean) 
    h <- data.frame(timestamp=trunc(index(h),'hours'), power=coredata(h)) 
}) 

Соответственные раз принимаются на два (один месяц, три месяца) различные наборы данных являются: За один месяц набора данных:

Method  user system elapsed 
Aggregate 0.137 0.005 0.142 
data.table 0.031 0.001 0.032 
dplyr  0.035 0.001 0.036 
xts   0.053 0.000 0.053 

За три месяца набор данных:

Aggregate 0.456 0.019 0.475 
data.table 0.099 0.002 0.102 
dplyr  0.099 0.004 0.103 
xts   0.158 0.004 0.161 

Caveat: Все подходы, кроме xts изменяет тип метки времени от POSIXct до Factor. Это означает, что вам нужно снова преобразовать столбец timestamp типа, который потребует еще нескольких циклов процессора. Короче говоря, если в конце вам понадобится временная метка POSIXct, тогда xts является лучшим, в противном случае - для data.table.

DATASET Dataset используется можно найти на link

+1

Можете ли вы попробовать с 'dplyr',' library (dplyr); dframe%>% group_by (timestamp = cut (as.POSIXct (timestamp), 'hour')%>% sumize (power = mean (power)) ' – akrun

+1

Я предполагаю, что' cut' вызывает много медленных событий, down –

+0

@akrun.Спасибо. data.table занимает меньше времени, чем все параметры, которые я использовал. Пожалуйста, предоставьте свой первый (с использованием data.table) комментарий в качестве ответа. Тем временем я добавлю статистику в главный вопрос. Я все еще смущен, почему это дало плохие результаты утром! –

ответ

3

В общем, aggregate медленно. Мы используем data.table для того, чтобы это сделать быстро. Преобразуйте 'data.frame' в 'data.table' (setDT(dframe)), мы используем cut, чтобы создать переменную группировки из «timestamp» и получить mean «power».

library(data.table) 
setDT(dframe)[, list(power= mean(power)) ,(timestamp= cut(as.POSIXct(timestamp), 'hour'))] 
4

Вы можете сделать это агрегирование менее чем за половину времени, используя инструменты из пакета xts.

# sample data 
set.seed(21) 
N <- 2e6 
dframe <- data.frame(timestamp=seq(Sys.time(), by="30 sec", length.out=N), 
        power=rnorm(N)) 
# aggregate 
system.time(a <- aggregate(list(power=dframe$power),by=list(timestamp=cut(dframe$timestamp,"hour")), mean)) 
# user system elapsed 
# 2.456 0.000 2.457 

# xts 
system.time({ 
    x <- xts(dframe$power, dframe$timestamp) 
    h <- period.apply(x, endpoints(x, "hours"), mean) 
    h <- data.frame(timestamp=trunc(index(h),'hours'), power=coredata(h)) 
}) 
# user system elapsed 
# 0.888 0.004 0.893 
+0

Я использовал xts и сравнивал его с другими методами. Его результат не впечатляет. Кажется, что data.table занимает очень мало времени. Я представил все результаты как обновление в главном вопросе –

+0

Xts ведет себя странным образом. Всякий раз, когда я использую пакеты xts, это приводит к 721 наблюдениям, в то время как остальные три метода, упомянутые в вопросе, приводят к 720 наблюдениям. Также почасовые средства, предоставляемые xts, немного отличаются от остальных методов ,Для уточнения, я включил и данные, о которых идет речь. –

+0

@HaroonRashid: это, скорее всего, проблема с часовым поясом. Вы должны решить его, установив часовой пояс в столбце 'POSIXct' (например,' attr (dframe $ timestamp, 'tzone') <- "UTC" '. –

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