我陷入了R.我需要将每分钟数据汇总到每30分钟。我的数据框是这样的:
trs = soup.find_all('tr')
for tr in trs:
spans = tr.find_all('span')
if spans.id == "ContentPlaceHolder1_grd_reminder_Label***":
print spans.string
...
基本上,我有2008年的500,979行数据。每分钟都有一个功率值。为了做时间序列,我需要每30分钟汇总一次数据。那最终会给我大约17,520行。我的问题是:
当Power列有一些缺失值时,是否可以绘制时间序列?
如何将Power值聚合30分钟? (例如,0:00:00到0:29:00; 0:30:00到0:59:00)
非常感谢!
答案 0 :(得分:1)
使用magrittr
和dplyr
,您可以生成一个新列,用于保存分组变量,其中包含测量所在的时间单位,然后summarise
来计算您想要的任何聚合度量。 (注意%<>%
将管道的结果保存回原始变量中。
我不确定你的时间格式是什么,当我读它时只是一个字符,所以将它转换为数字小时需要做一些事情。如果它已经采用其他格式,那么这一步可能会更容易。
df %<>%
mutate(cleanTime =
strsplit(Time, ":") %>%
sapply(function(x){
x <- as.numeric(x)
x[1] + x[2]/60 + x[3]/(60*60)
})
, roundTime = floor(cleanTime * 2)/2
)
然后,按生成的变量进行分组,并获取您想要的任何聚合统计数据:
df %>%
group_by(Date, roundTime) %>%
summarise(avgPower = mean(Power)
, sumPower = sum(Power))
给出:
Date roundTime avgPower sumPower
<date> <dbl> <dbl> <dbl>
1 2008-10-11 23.5 0.3746667 1.124
2 2008-10-12 0.0 0.3320000 0.664
3 2008-12-13 19.0 1.3670000 8.202
答案 1 :(得分:1)
使用dplyr
,您可以执行下一步操作(您可以将mean
更改为您的聚合功能):
df %>%
mutate(DateTime = as.POSIXct(paste(Date, Time))) %>%
group_by(DateTime = cut(DateTime, breaks="30 min")) %>%
summarize(Power = mean(Power))
将导致下一个输出:
DateTime Power
<fctr> <dbl>
1 2008-10-11 23:57:00 0.3576
2 2008-12-13 18:57:00 1.3760
3 2008-12-13 19:27:00 1.3580