计算行是指在另一个数据框中定义的间隔?

时间:2016-08-12 13:05:45

标签: r dataframe

我有一个包含2个变量的数据框:" time"和"温度"。变量" time"具有以下格式:"%Y-%m-%d%H:%M:%S"。我想计算每天昼夜的平均温度。日期和夜晚应由日出和日落时间定义,这些时间存储在第二个数据框中。这意味着每天昼夜都有不同的开始和结束时间。

所以我的问题是:如何计算日出和日落时间定义的每天,每天,每天和每晚的平均温度?

包含温度的第一个数据框如下所示:

time_temp_data <- data.frame(
  time = seq(
    as.POSIXct("2013-05-24 15:01:01"), 
    as.POSIXct("2013-06-02 03:31:01"), 
    by = "3 min"
    ), 
  temp = seq(7.153, 36.809, length.out = length(time))
  )

包含日出和日落时间的第二个数据框看起来像这样:

sunrise_sunset <- data.frame(
  event = rep(c("sunrise", "sunset"), 21),
  time = as.POSIXct(c("2013-05-18 03:59:01", "2013-05-18 22:07:01", "2013-05-   19 03:57:01", "2013-05-19 22:09:01", "2013-05-20 03:55:01",
                             "2013-05-20 22:11:01", "2013-05-21 03:53:01",  "2013-05-21 22:13:01", "2013-05-22 03:51:01", "2013-05-22 22:15:01",
                             "2013-05-23 03:49:01", "2013-05-23 22:18:01", "2013-05-24 03:47:01", "2013-05-24 22:20:01", "2013-05-25 03:45:01",
                             "2013-05-25 22:22:01", "2013-05-26 03:44:01", "2013-05-26 22:24:01", "2013-05-27 03:42:01", "2013-05-27 22:26:01", 
                             "2013-05-28 03:40:01", "2013-05-28 22:27:01", "2013-05-29 03:38:01", "2013-05-29 22:29:01", "2013-05-30 03:37:01",
                             "2013-05-30 22:31:01", "2013-05-31 03:35:01", "2013-05-31 22:33:01", "2013-06-01 03:34:01", "2013-06-01 22:35:01",
                             "2013-06-02 03:32:01", "2013-06-02 22:36:01", "2013-06-03 03:31:01", "2013-06-03 22:38:01", "2013-06-04 03:30:01",
                             "2013-06-04 22:40:01", "2013-06-05 03:29:01", "2013-06-05 22:41:01", "2013-06-06 03:28:01", "2013-06-06 22:42:01",
                             "2013-06-07 03:28:01", "2013-06-07 22:44:01"))

  )

一种方法是合并两个数据帧。但是,我的两个数据帧的公共变量(&#34; time&#34;)没有完全相同的数据。理想情况是使用逻辑运算符(≥,≤)合并数据帧,但我没有设法做到这一点。

编辑
问题已被修改,不再被视为过于宽泛。该示例可以开箱即用。

1 个答案:

答案 0 :(得分:1)

此解决方案使用dplyr包来处理数据帧,lubridate用于日期时间操作,magrittr用于管道命令。

library(dplyr)
library(lubridate)
library(magrittr)

这是一个示例数据集:

time_temp_data <- data.frame(
  time = seq(
    as.POSIXct("2016-08-11"), 
    as.POSIXct("2016-08-12 23:00:00"),
    by = "1 hour",
  ),
  temp = rnorm(48)
)
sunrise_sunset_data <- data.frame(
  sunrise = as.POSIXct(c("2016-08-11 05:59:30", "2016-08-12 06:00:30")),
  sunset = as.POSIXct(c("2016-08-11 21:00:30", "2016-08-12 20:59:30"))
)

首先,我们在数据集中添加列(&#34; mutate&#34;),将日期时间分为日期和时间。

time_temp_data %<>%
  mutate_(
    date = ~ floor_date(time, "day"),
    time_of_day = ~  difftime(time, date, "hours")
  )

sunrise_sunset_data %<>%
  mutate_(
    date = ~ floor_date(sunrise, "day"),
    time_of_sunrise = ~ difftime(sunrise, date, "hours"),
    time_of_sunset = ~ difftime(sunset, date, "hours")
  )  

然后我们将时间/临时数据加入日出/日落数据:

all_data <- inner_join(time_temp_data, sunrise_sunset_data, by = "date")

夜间是指日落之后或日出之前的时间。

all_data %<>%
  mutate_(
    is_night = ~ time_of_day > time_of_sunset | time_of_day < time_of_sunrise
  )

现在可以通过对这些变量进行分组并计算汇总统计数据来计算每个日期和日/夜时间的平均温度。

all_data %>%
  group_by_(~ date, ~ is_night) %>%
  summarize_(mean_temp = ~ mean(temp))