白天和黑夜中每天的平均值

时间:2018-10-13 16:59:27

标签: aggregate average

我有一个从4月到10月的数据集,每天每5分钟记录一次数据。我想获取每天白天和黑夜的平均温度和相对湿度,考虑从7:30到18:30的“白天”和其余时间的“夜晚”, 该表如下所示:

    Date        Time        Temp    RH 
    18/04/2018  00:00:00    21.9    73
    18/04/2018  00:05:00    21.9    73
    18/04/2018  00:10:00    21.8    73
    18/04/2018  00:15:00    21.6    73
    18/04/2018  00:20:00    21.6    72
    18/04/2018  00:25:00    21.5    72
    18/04/2018  00:30:00    21.4    74

以此类推,直到十月。我曾尝试过类似问题的代码,但由于某种原因或其他原因,我总是会出错。在一个示例中,我看到有一个带有“ AM / PM”值的列可以简化此过程,但随后我必须为所有行创建一个新列。也尝试使用“ hourly.apply”,但似乎该功能不存在。

我想获得的是这样的:

    Date       Time     Temp    RH 
    18/04/2018  day     25.8    80
    18/04/2018  night   17.3    43
    19/04/2018  day     24.2    73
    19/04/2018  night   15.1    42

我输入了代码:

> n=287
> T24_GH111 <- aggregate(GH111[,3],list(rep(1:nrow(GH111%%n+1), each=n, leng=nrow(GH111))),mean)[-1];`

但这将平均给我24小时。

谢谢!

1 个答案:

答案 0 :(得分:0)

让我们从一个简单的例子开始,用日期时间创建一个日期框架。

library(lubridate) # for datetime manipulation
# Creating simple example
Datetime <- c(as.POSIXct("2018-04-17 22:00", tz="Europe/Berlin"),
              as.POSIXct("2018-04-18 01:00", tz="Europe/Berlin"),
              as.POSIXct("2018-04-18 10:00", tz="Europe/Berlin"),
              as.POSIXct("2018-04-18 13:00", tz="Europe/Berlin"),
              as.POSIXct("2018-04-18 22:00", tz="Europe/Berlin"),
              as.POSIXct("2018-04-19 01:00", tz="Europe/Berlin")
              )
x <- c(1,3,10,20,2,5)
df <- data.frame(Datetime,x)

现在,我们使用 local_time() 包中的 lubridate 来定义新的日/夜变量。

# Getting local time in hours
df$time <- local_time(df$Datetime, units ="hours")
# Setting day night parameter
t1 <- 7.5  # 07:30
t2 <- 18.5 # 18:30
df$dayNight <- ""
idx <- xor(t1 < df$time ,df$time < t2)
df$dayNight[idx] <- "day"
df$dayNight[!idx] <- "night"

要按天聚合,我们需要更改所有日期时间 < 07:30 的日期。幸运的是,我们已经设置了当地时间。所以,让我们用它来设置一个 dummyDate 变量。 (这将是结果日期)

cond <- df$time < t1
# Using dummyDate for aggregate for dayNight values per day
df$dummyDate <- df$Datetime
df$dummyDate[nightCondition] <- df$Datetime[nightCondition] - days(1)
df$dummyDate <- floor_date(df$dummyDate, unit = "day") # flooring date for aggregation
df

             Datetime  x     time dayNight  dummyDate
1 2018-04-17 22:00:00  1 22 hours      day 2018-04-17
2 2018-04-18 01:00:00  3  1 hours      day 2018-04-17
3 2018-04-18 10:00:00 10 10 hours    night 2018-04-18
4 2018-04-18 13:00:00 20 13 hours    night 2018-04-18
5 2018-04-18 22:00:00  2 22 hours      day 2018-04-18
6 2018-04-19 01:00:00  5  1 hours      day 2018-04-18

现在,我们已经设置了所有变量以使用aggregate函数通过xdayNight计算dummyDate的均值

# Aggregating x value per dummyDate and daynight variables
dfAgg <- aggregate(df[,2], list(Date = df$dummyDate, Time = df$dayNight), mean)
dfAgg

        Date  Time    x
1 2018-04-17   day  2.0
2 2018-04-18   day  3.5
3 2018-04-18 night 15.0