2017-02-10 106 views
1

我在尝试计算平均温度10分钟但24小时内向量时遇到了麻烦。平均间隔10分钟的大型不规则间隔时间序列产生24小时配置文件

我有一个时间系列以正确的POSIX格式存储在数据帧中。唯一的问题是数据不规则间隔(10±3分钟)。

我知道如何平均他们在几小时,几天,几个月的年份但我需要获得24,72或168小时的档案的平均值。

例如,对于168小时配置文件,我希望在每个星期一的观察期间在00:00:00,然后在00:10:00,00:20:00等,然后每个星期二,星期三等。

所以我的数据平均值必须符合常规24/72/168向量。

对于24小时向量将像这样被定义:

seq(ISOdatetime(2001,2,3,0,0,0), ISOdatetime(2001,2,4,0,0,0), by=(60*5)) 

在常规24小时矢量所得source of this solution here

[1] "2001-02-03 00:00:00 PST" "2001-02-03 00:05:00 PST" 
    [3] "2001-02-03 00:10:00 PST" "2001-02-03 00:15:00 PST" 
    [5] "2001-02-03 00:20:00 PST" "2001-02-03 00:25:00 PST" 
    [7] "2001-02-03 00:30:00 PST" "2001-02-03 00:35:00 PST" 
    [9] "2001-02-03 00:40:00 PST" "2001-02-03 00:45:00 PST" 

问题是我的数据的时间戳与每一天您移可以从下面的示例中看到。在2016-09-01首读(应该是在00:00:00)是00:01:00,第二天是00:04:00,第二天00:07:00等等。

我试过xtszoo没有成功,因为聚合的限制是小时,我需要在几分钟内定义它

的多个答案我已经找到了对付通过不断的数据集(example1平均时间序列,example2

可惜我找不到关于我的问题的答案。示例数据库的

结构:

'data.frame': 9490 obs. of 2 variables: 
$ Date_Time_Stamp : POSIXct, format: "2016-09-01 00:01:00" "2016-09-01 00:11:00" "2016-09-01 00:22:00" "2016-09-01 00:32:00" ... 
$ Signal_Raw_Value: num 778 694 592 523 567 ... 

我的数据是这样的(头)尾

Date_Time_Stamp Signal_Raw_Value 
1 2016-09-01 00:01:00   777.51 
2 2016-09-01 00:11:00   694.38 
3 2016-09-01 00:22:00   591.69 
4 2016-09-01 00:32:00   523.23 
5 2016-09-01 00:42:00   567.24 
6 2016-09-01 00:52:00   547.68 

Date_Time_Stamp Signal_Raw_Value 
9485 2016-11-06 23:02:00   660.15 
9486 2016-11-06 23:12:00   635.70 
9487 2016-11-06 23:22:00   498.78 
9488 2016-11-06 23:32:00   415.65 
9489 2016-11-06 23:42:00   425.43 
9490 2016-11-06 23:53:00   440.10 

第一个小时2016年9月1日

Date_Time_Stamp Signal_Raw_Value 
1 2016-09-01 00:01:00   777.51 
2 2016-09-01 00:11:00   694.38 
3 2016-09-01 00:22:00   591.69 
4 2016-09-01 00:32:00   523.23 
5 2016-09-01 00:42:00   567.24 
6 2016-09-01 00:52:00   547.68 
7 2016-09-01 01:02:00   562.35 

第二天的第一个小时(2016年9月2日)

143 2016-09-02 00:04:00   557.46 
144 2016-09-02 00:14:00   557.46 
145 2016-09-02 00:24:00   562.35 
146 2016-09-02 00:35:00   552.57 
147 2016-09-02 00:45:00   503.67 
148 2016-09-02 00:55:00   484.11 
149 2016-09-02 01:05:00   454.77 

第三天行(2016年9月3日)

285 2016-09-03 00:07:00   655.26 
286 2016-09-03 00:17:00   537.90 
287 2016-09-03 00:27:00   464.55 
288 2016-09-03 00:38:00   454.77 
289 2016-09-03 00:48:00   425.43 
290 2016-09-03 00:58:00   420.54 
291 2016-09-03 01:08:00   400.98 

和第四日的前1小时:

426 2016-09-04 00:00:00   865.53 
427 2016-09-04 00:10:00   723.72 
428 2016-09-04 00:20:00   621.03 
429 2016-09-04 00:30:00   562.35 
430 2016-09-04 00:40:00   493.89 
431 2016-09-04 00:51:00   459.66 
432 2016-09-04 01:01:00   435.21 

处理信号的原始值后,我需要制作这样的事情: 24 hrs profile和168小时:168 hrs profile

谢谢!

+0

解决此问题的一种方法是使用seq函数从数据的开始到结束创建一个10分钟间隔的数组。使用新创建的数组的cut函数作为break参数。现在你可以聚合,但新定义的切割值 – Dave2e

+0

我有一个部分成功与以下(优雅?)解决方案: 聚合(qxts,格式(索引(qxts),“%H”),平均值) 这产生每小时每小时平均值。我坚持改变间隔10或15分钟。任何想法如何继续前进? – Patryk

回答

0

既然你还在这个问题挣扎试试这个:

#Create sample data 
#create a sequence of random times (about 10 minutes apart) 
rtime <-as.integer(rnorm(1000, 10, 2)) 
Date_Time_Stamp<- as.POSIXct("2016-09-01") 
Date_Time_Stamp<-Date_Time_Stamp+cumsum(rtime)*60 
Signal_Raw_Value <- rnorm(1000, 600, 20) 
df<-data.frame(Date_Time_Stamp, Signal_Raw_Value) 
#End of sample data creation 

#Calclated the number of minutes since midnight 
df$minutes<-as.integer(format(df$Date_Time_Stamp, "%H"))*60 + as.integer(format(df$Date_Time_Stamp, "%M")) 
#break into 144 intervals per day 
df$mybreaks<-cut(df$minutes, breaks = seq(0, 1440, 10), include.lowest = TRUE) 

#Using dplyr 
library(dplyr) 
#find mean of each group 
summarise(group_by(df, mybreaks), mean(Signal_Raw_Value)) 
#find number of elements in each grouping 
summarise(group_by(df, mybreaks), n()) 

您的问题声明也不是很清楚。这是一个解决方案,将一天的时间分成144个10分钟(1440分钟/天)段,并将整个数据集中的数据平均到144个间隔。

+0

非常感谢您的帮助。我已经测试了您的解决方案,但结果是我获得了整个数据集的单个平均值。 – Patryk

+0

此外:在最后一个脚本中,我得到n()中的错误 - 不应该直接调用此函数。 我觉得问题是'mybreaks'的结构 - 它是因素,应该是日期格式。试图解决它,但我得到的错误。将报告,如果我解决它。 – Patryk

+0

解决方案的一部分是我总结而不是summarise_。现在我得到了10分钟的间隔值,但计算的平均值是恒定的,并且它没有按照间隔对它进行分组 - 我获得了884行的整个列表 - 应该是144分钟的间隔。 – Patryk

相关问题