【问题标题】:How can I plot hourly averaged time series grouped by month?如何绘制按月分组的每小时平均时间序列?
【发布时间】:2020-01-17 16:35:26
【问题描述】:

我有一个长期的时间序列(22 年),并希望按月对数据进行分组并平均每小时来获得昼夜温度曲线。下面是我的数据集。

        Datetime.LST ruc.197.118 narr.225.118 KLAF VAIv212_08748740771
1   12/31/1996 18:00          NA      -0.7843   NA                  NA
2   12/31/1996 19:00          NA      -1.2432   NA                  NA
3   12/31/1996 20:00          NA      -1.7022   NA                  NA
4   12/31/1996 21:00          NA      -2.1611   NA                  NA
5   12/31/1996 22:00          NA      -2.1026   NA                  NA
6   12/31/1996 23:00          NA      -2.0440   NA                  NA
7      1/1/1997 0:00          NA      -1.9854   NA           0.4120480
8      1/1/1997 1:00          NA      -1.7506   NA           0.4400940
9      1/1/1997 2:00          NA      -1.5157   NA           0.4594420
10     1/1/1997 3:00          NA      -1.2808   NA           0.3232730
11     1/1/1997 4:00          NA      -0.9326   NA           0.0754700
12     1/1/1997 5:00          NA      -0.5844   NA          -0.0730896
13     1/1/1997 6:00          NA      -0.2363   NA          -0.1574400
14     1/1/1997 7:00          NA       0.3422   NA          -0.2461240
15     1/1/1997 8:00          NA       0.9207   NA          -0.0277405
  temperature_data <- read.csv(temp_hourly, stringsAsFactors = FALSE)
  monthly_hourly <- temperature_data %>%
              dmy_hm(.$Datetime.LST, tz = "GMT") %>%
              dplyr::group_by(month=format(Datetime.LST,'%m'), hour=format(as.POSIXct(cut(Datetime.LST, breaks = 'hour')),"%H")) %>%
              summarise(meanVal=mean(val,na.rm=TRUE))
}

使用dput的示例数据集

> dput(head(temperature_data[, c(1,2,3,4,5)]))
structure(list(Datetime.LST = c("12/31/1996 18:00", "12/31/1996 19:00", 
"12/31/1996 20:00", "12/31/1996 21:00", "12/31/1996 22:00", "12/31/1996 23:00"
), ruc.197.118 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_), narr.225.118 = c(-0.7843, -1.2432, -1.7022, -2.1611, 
-2.1026, -2.044), KLAF = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), VAIv212_08748740771 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), .Names = c("Datetime.LST", 
"ruc.197.118", "narr.225.118", "KLAF", "VAIv212_08748740771"), row.names = c(NA, 
6L), class = "data.frame")

Datetime.LST 作为ch 数据类型引入。我在获取不同的日期包(lubridate)以同意dplyrgroup_by 函数时遇到了一些问题。

附件是我希望看到的示例绘图输出。

使用下面的 Andrews cmets,更新代码和当前输出:

  temperature_data <- read.csv(temp_hourly, stringsAsFactors = FALSE)
  monthly_hourly <-   temperature_data %>%
    mutate(Datetime.LST = mdy_hm(Datetime.LST, tz = "GMT"),
           day = day(Datetime.LST),
           month = month(Datetime.LST),
           hour = hour(Datetime.LST)) %>%
    group_by(month, hour) %>% 
    summarise(
      ruc.197.118 = mean(ruc.197.118, na.rm = TRUE),
      narr.225.118 = mean(narr.225.118, na.rm = TRUE),
      KLAF = mean(KLAF, na.rm = TRUE),
      VAIv212_08748740771 = mean(VAIv212_08748740771, na.rm = TRUE)
    ) %>%
    # next step creates a dummy year to group month/day/hr as datetime
    mutate(month_name = month(month, label = TRUE)) 
  ggplot(data = monthly_hourly,aes(x = hour)) +
  geom_line(color = "red", aes(y = ruc.197.118)) + 
  geom_line(color = "blue", aes(y = narr.225.118)) + 
  geom_line(color = "black", aes(y = KLAF)) + 
  geom_line(color = "orange", aes(y = VAIv212_08748740771)) + 
  xlab("Temperature degC") +
  ylab("Hour of Day") +
  facet_wrap(~ month_name)

【问题讨论】:

  • 嘿,有一些额外的东西来看看已经做了什么以及可以做什么会很有帮助。您能否发布一些您尝试过的代码(使用group_by)和您的数据样本(使用dput),以确保发布的解决方案专门适用于您的数据?
  • (作为初始尝试,lubridatemonth() 函数将从日期/时间变量中提取月份,然后您可以将其用作新变量以分组(@ 987654338@...),如果您的 Datetime.LST 已经格式化?
  • @AndrewBaxter 推进了一些编辑。
  • 嗨@twseewx,您还有其他问题需要解决吗?如果事情不起作用,请详细说明,或者如果一切都解决了,请将问题标记为已回答。

标签: r dataframe date ggplot2 dplyr


【解决方案1】:

按照上面的代码,它可以提取日期、月份和小时作为新变量,然后进行分组、汇总和绘制图表:

monthly_hourly <- df %>%
  bind_rows(data.frame(Datetime.LST = "1/1/1970 1:00")) %>% 
  mutate(Datetime.LST = mdy_hm(Datetime.LST, tz = "GMT"),
         day = day(Datetime.LST),
         month = month(Datetime.LST, label = TRUE),
         hour = hour(Datetime.LST)) %>%
  group_by(month, hour) %>% 
  summarise(
    ruc.197.118 = mean(ruc.197.118, na.rm = TRUE),
    narr.225.118 = mean(narr.225.118, na.rm = TRUE),
    KLAF = mean(KLAF, na.rm = TRUE),
    VAIv212_08748740771 = mean(VAIv212_08748740771, na.rm = TRUE)
  )

monthly_hourly %>% 
  ggplot(aes(hour)) +
  geom_line(color = "red", aes(y = ruc.197.118)) + 
  geom_line(color = "blue", aes(y = narr.225.118)) + 
  geom_line(color = "black", aes(y = KLAF)) + 
  geom_line(color = "orange", aes(y = VAIv212_08748740771)) + 
  facet_wrap(~ month, scales = "free")

【讨论】:

  • @twseewx - 注意到您的代码也添加到了那里,很快就会更新答案,以免重新发明轮子!
  • 所以我已经设置了日期月份小时,所以我不能只使用 dplyr filter 来选择第 1 个月,然后也得到每个小时的平均值吗?
  • 啊我明白你的意思了!没有记录到您打算将所有一月组合在一起(跨越 22 年)等。一种方法可能是 filter 并为每个月创建一个新的数据框。但这需要您执行 12 次,然后将 12 个数据帧重新组合在一起。更好的原则是将所有内容放在一个数据框中 - 我已将上面的代码调整为 group_by 月/日/小时,然后按月分组(现在显示为角色名称)。这有帮助吗?
  • 我没有summarise_if 的更新版本dplyr 可以使用,并且就我的环境而言无法更新。
  • 我现在更新了我上面的代码,以合并您提供的编辑以及我的小调整。带有更新的输出图。
猜你喜欢
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2012-08-17
  • 1970-01-01
  • 2019-10-13
  • 2020-06-01
相关资源
最近更新 更多