【问题标题】:Average a big irregularly spaced time series in 10 minutes intervals to produce a 24 hour profile以 10 分钟为间隔对一个不规则间隔的大时间序列进行平均,以生成 24 小时的概况
【发布时间】:2017-02-10 15:18: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,但没有成功,因为聚合的限制是小时,我需要以分钟为单位定义它。

我发现的多个答案通过连续的数据集处理平均时间序列(example1example2

很遗憾,我找不到关于我的问题的答案。

示例数据库的结构:

'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-09-01 的第一个小时

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-09-02)

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-09-03)

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

第四天:

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

谢谢!

【问题讨论】:

  • 解决此问题的一种方法是使用 seq 函数创建一个从数据开始到结束的 10 分钟间隔的数组。使用新创建的数组作为 break 参数的 cut 函数。现在您可以聚合但新定义的切割值
  • 我在以下(优雅?)解决方案方面取得了部分成功:聚合(qxts,格式(索引(qxts),“%H”),平均值)这会产生每小时的每小时平均值。我坚持将间隔更改为 10 或 15 分钟。任何想法如何继续?

标签: r datetime time time-series average


【解决方案1】:

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

#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 个间隔中。

【讨论】:

  • 非常感谢您的帮助。我已经测试了您的解决方案,但结果我得到了整个数据集的单一平均值。
  • 此外:在最后一个脚本中,我在 n() 中遇到错误 - 不应直接调用此函数。我认为问题出在“mybreaks”的结构上——它是因素,应该是日期格式。试图修复它,但我遇到了错误。如果我解决它会报告。
  • 部分解决方案是我把 summarise 而不是 summarise_。现在我得到 10 分钟的间隔值,但计算出的平均值是恒定的,它未能按间隔分组 - 我得到了 884 行的整个列表 - 应该是 10 分钟间隔的 144。
  • @Dave2e 作为一个临时解决方案,我应用了 align.time 并创建了相等的时间索引。然后我可以用 xts 类型聚合它:'code' aggregate (qxts, format (index (qxts), "%H"), mean) 'code'
  • 在没有实际数据样本和所需输出示例的情况下工作会导致这些类型的问题。对不起,但你的问题不是很清楚。您想要所有 4 天中每 10 分钟间隔的平均值吗?
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2015-03-10
  • 2012-07-23
  • 1970-01-01
  • 2019-09-05
相关资源
最近更新 更多