【问题标题】:Obtain a variable mean for a time period获取一段时间内的变量均值
【发布时间】:2021-12-01 22:30:40
【问题描述】:
我的分析受阻
我有一个像这样的数据集:
| Date |
Light |
| 2019-02-15 01:00:00 |
0.134 |
| 2019-02-15 02:00:00 |
0.345 |
| 2019-02-15 03:00:00 |
0.567 |
| 2019-02-15 04:00:00 |
0 |
| 2019-02-15 05:00:00 |
0.100 |
| ... |
... |
| 2019-03-10 15:00:00 |
0.890 |
| ... |
... |
这是一个包含大量日期的大型数据集。而且我正在尝试获得不同时间段的光平均值:日平均值; 5天平均值; 1 周平均值(过去 4 天 + 今天;过去 6 天 + 今天和每日平均值)
我想要的结果就像这个数据集:
| Date |
Light |
timeperiod_5days |
timeperiod_1week |
timeperiod_24h |
我尝试使用不同的功能:timeAverage; xts。但我无法得到任何结果,我不知道它们是否适合我想要的。
有人知道我如何获得我的结果吗?
提前致谢!
【问题讨论】:
标签:
r
dataframe
datetime
time
period
【解决方案1】:
我不确定您所期望的结果。您有可以分享的部分或全部代码吗?
我有一些东西可以作为一个开始。
data = read.csv(file = "data",header = T,sep = ",")
data$Date = as.POSIXct(data$Date , format = "%Y-%m-%d %H:%M:%S" ) #to make date as date in R
data$Day = format(data$Date,"%Y-%m-%d") #to extract only the day
# Aggregation
tab_A = aggregate(x=data[,-c(1,2,3)], by=list(A=data$Day), FUN=mean , na.rm = T) # Whith that you can get the daily mean of your data base
如果您找到一种方法来通过周数描述 R 中的“周”,例如,您可以按每年的周汇总。
至于过去 4 天 + 今天,您可以简单地说:
mean(data$Light[(length(data$Light)-5):length(data$Light)])
【解决方案2】:
不确定“24h”是指“今天”还是“过去 24 小时”,在第一种情况下,您的最终代码将如下所示:
library(dplyr)
library(lubridate)
rollmean <- function(i,window){
startdate <- as.Date(df$Date[i])-days(window-1)
enddate <- as.Date(df$Date[i])+1
tmp <- df %>% filter(between(as.Date(Date), startdate, enddate))
return(mean(tmp$Light))
}
for (i in 1:nrow(df)) {
df[i, "timeperiod_24h"] <- rollmean(i, 1)
df[i, "timeperiod_5d"] <- rollmean(i, 5)
df[i, "timeperiod_7d"] <- rollmean(i, 7)
}
结果:
Date Light timeperiod_24h timeperiod_5d timeperiod_7d
1 2019-02-15 01:00:00 0.134 0.2292 0.2292 0.2292
2 2019-02-15 02:00:00 0.345 0.2292 0.2292 0.2292
3 2019-02-15 03:00:00 0.567 0.2292 0.2292 0.2292
4 2019-02-15 04:00:00 0.000 0.2292 0.2292 0.2292
5 2019-02-15 05:00:00 0.100 0.2292 0.2292 0.2292
6 2019-02-17 05:00:00 0.300 0.3000 0.2410 0.2410
7 2019-03-10 15:00:00 0.890 0.8900 0.8900 0.8900
如果您想要“过去 24 小时”,则将 as.Dates 放在函数中并稍微更改舍入。