查找气候数据中每日最大变量的时间

时间:2017-09-23 04:01:17

标签: r max posix

我有一个多年的大型数据集,它有几个变量,但我感兴趣的是风速和日期时间。我想找到数据集中每天最大风速的时间。我有Posixct格式的每小时数据,WS作为偶数NA的数字。下面是一个简短的数据集,应该有希望说明我的观点,但是我的dateTime不是每小时数据,但它提供了足够的样本。

dateTime <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"),
            as.POSIXct("2011-01-29 23:00:00", tz = "GMT"),
            by = 60*24)
WS <- sample(0:20,1798,rep=TRUE)
WD <- sample(0:390,1798,rep=TRUE)
Temp <- sample(0:40,1798,rep=TRUE)
df <- data.frame(dateTime,WS,WD,Temp)
df$WS[WS>15] <- NA

我之前尝试使用posix日期(减去时间)创建一个新列以允许日间隔离,但是我尝试的所有内容都只返回了带有日期和WS的缩短数据框(聚合,拆分,xts )。 Aggregate只是一个没有这样做的人,然而,它给了我23:00:00作为一个不正确的恒定时间。

我查看了How to calculate daily means, medians, from weather variables data collected hourly in R?https://stats.stackexchange.com/questions/7268/how-to-aggregate-by-minute-data-for-a-week-into-hourly-means和其他人,但没有人回答过这个问题,或者解决方案没有找到理想的结果。

我需要将此分析的结果与另一个数据框进行比较,因此我需要在数据集中每天发生最大风速时的实际时间。我觉得有一个简单的解决方案,然而,这让我很沮丧。

3 个答案:

答案 0 :(得分:2)

dplyr解决方案可能是:

library(dplyr)

df %>%
  mutate(date = as.Date(dateTime)) %>%
  left_join(
    df %>%
      mutate(date = as.Date(dateTime)) %>%
      group_by(date) %>%
      summarise(max_ws = max(WS, na.rm = TRUE)) %>%
      ungroup(),
    by = "date"
  ) %>%
  select(-date)

#                 dateTime WS  WD Temp max_ws
# 1    2011-01-01 00:00:00 NA 313    2     15
# 2    2011-01-01 00:24:00  7 376    1     15
# 3    2011-01-01 00:48:00  3  28   28     15
# 4    2011-01-01 01:12:00 15 262   24     15
# 5    2011-01-01 01:36:00  1 149   34     15
# 6    2011-01-01 02:00:00  4 319   33     15
# 7    2011-01-01 02:24:00 15 280   22     15
# 8    2011-01-01 02:48:00 NA 110   23     15
# 9    2011-01-01 03:12:00 12  93   15     15
# 10   2011-01-01 03:36:00  3   5    0     15

答案 1 :(得分:1)

Dee要求:&#34;我想找到数据集中每天最大风速的时间。&#34;其他答案计算了每天的最大值(WS),但没有计算出发生的时间。

所以我建议使用dyplr的以下解决方案:

library(dplyr)
set.seed(12345)
dateTime <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"),
                as.POSIXct("2011-01-29 23:00:00", tz = "GMT"),
                by = 60*24)
WS <- sample(0:20,1738,rep=TRUE)
WD <- sample(0:390,1738,rep=TRUE)
Temp <- sample(0:40,1738,rep=TRUE)
df <- data.frame(dateTime,WS,WD,Temp)
df$WS[WS>15] <- NA

df %>% 
  group_by(Date = as.Date(dateTime)) %>% 
  mutate(Hour = hour(dateTime),
         Hour_with_max_ws = Hour[which.max(WS)])

enter image description here

我想要强调的是,如果有几个小时具有相同的最大风速(在下面的例子中:15),只有第一小时的最大值(WS)将显示为结果,尽管已达到风速15在那个日期的0,3,4,21和22小时!所以你可能需要一个更具体的逻辑。

enter image description here

答案 2 :(得分:0)

为了完整起见(因为我喜欢简洁的代码),这里是使用data.table的“单行”:

library(data.table)
setDT(df)[, max.ws := max(WS, na.rm = TRUE), by = as.IDate(dateTime)][]
                 dateTime WS  WD Temp max.ws
   1: 2011-01-01 00:00:00 NA 293   22     15
   2: 2011-01-01 00:24:00 15  55   14     15
   3: 2011-01-01 00:48:00 NA 186   24     15
   4: 2011-01-01 01:12:00  4 300   22     15
   5: 2011-01-01 01:36:00  0 120   36     15
  ---                                       
1734: 2011-01-29 21:12:00 12 249    5     15
1735: 2011-01-29 21:36:00  9 282   21     15
1736: 2011-01-29 22:00:00 12 238    6     15
1737: 2011-01-29 22:24:00 10 127   21     15
1738: 2011-01-29 22:48:00 13 297    0     15