У меня есть файл данных, содержащий отсчеты, отснятые с длительностью 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
Можете ли вы попробовать с 'dplyr',' library (dplyr); dframe%>% group_by (timestamp = cut (as.POSIXct (timestamp), 'hour')%>% sumize (power = mean (power)) ' – akrun
Я предполагаю, что' cut' вызывает много медленных событий, down –
@akrun.Спасибо. data.table занимает меньше времени, чем все параметры, которые я использовал. Пожалуйста, предоставьте свой первый (с использованием data.table) комментарий в качестве ответа. Тем временем я добавлю статистику в главный вопрос. Я все еще смущен, почему это дало плохие результаты утром! –