【问题标题】:How to obtain hourly average of values in a time series data frame with multiple columns如何在具有多列的时间序列数据框中获取每小时平均值
【发布时间】:2019-09-13 23:14:52
【问题描述】:

我有一个包含 3 列的时间序列数据,其中包含日期、能量值和站点名称。 我想分别获得每个站点的能量值的小时平均值。

我的数据是这样的

df

     Datetime          Energy  Station
1 2016-01-01 07:19:00 743.0253   Ajmer
2 2016-01-01 07:20:00 765.7225   Ajmer
3 2016-01-01 07:21:00 788.1493   Ajmer
4 2016-01-01 08:20:00 834.7815   Ajmer
5 2016-01-01 08:21:00 857.3012   Ajmer
6 2016-01-31 16:58:00 3427.098  Kotada
7 2016-01-31 16:59:00 3397.591  Kotada
8 2016-01-31 17:00:00 3344.149  Kotada
9 2016-01-31 17:01:00 3270.803  Kotada

预期输出:

     Datetime          Energy    Station
1. 2016-01-01 07:00:00 765.6324   Ajmer
2. 2016-01-01 08:00:00 846.0413   Ajmer
3. 2016-01-01 16:00:00 3412.345   Kotada
4. 2016-01-01 17:00:00 3307.476   Kotada

我尝试使用 group_by 函数按站名形成分组数据框,然后使用聚合函数获得每小时平均值。但它不起作用。

> byStn=df %>% group_by(Station)
> hour_byStn=byStn %>% 
+            aggregate(energy,                                      
+                       list(hourtime = cut(Datetime, breaks="hour")),  
+                       mean, na.rm = TRUE)

我得到以下错误: 剪切错误(日期时间,中断 =“小时”):找不到对象“日期时间”。

你能告诉我怎么做吗?这是我第一次使用时间序列数据和 dpylr 包。

【问题讨论】:

    标签: r dplyr time-series


    【解决方案1】:

    我们可以使用lubridate 中的floor_date 将“DateTime”按hourly 间隔设置,在group_by 中与“Station”一起使用并获得“Energy”的mean

    library(lubridate)
    library(tidyverse)
    df %>%
        group_by(Datetime = floor_date(Datetime, "hour"), Station) %>%
        summarise(Energy = mean(Energy, na.rm = TRUE))
    # A tibble: 4 x 3
    # Groups:   Datetime [4]
    #  Datetime            Station Energy
    #  <dttm>              <chr>    <dbl>
    #1 2016-01-01 07:00:00 Ajmer     766.
    #2 2016-01-01 08:00:00 Ajmer     846.
    #3 2016-01-31 16:00:00 Kotada   3412.
    #4 2016-01-31 17:00:00 Kotada   3307.
    

    数据

    df <- structure(list(Datetime = structure(c(1451650740, 1451650800, 
    1451650860, 1451654400, 1451654460, 1454277480, 1454277540, 1454277600, 
    1454277660), class = c("POSIXct", "POSIXt"), tzone = ""), Energy = c(743.0253, 
    765.7225, 788.1493, 834.7815, 857.3012, 3427.098, 3397.591, 3344.149, 
    3270.803), Station = c("Ajmer", "Ajmer", "Ajmer", "Ajmer", "Ajmer", 
    "Kotada", "Kotada", "Kotada", "Kotada")), row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9"), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      我还没有测试过,但你想要一些类似的东西......

      df %>%
          mutate(hourtime = cut(Datetime, breaks='hour')) %>%
          group_by(Station, hourtime) %>%
          summarise(avg_energy = mean(Energy, na.rm = T))
      

      我建议也许阅读一些基本的dplyr 语法。当我第一次开始使用它时,我虔诚地引用了它:https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 2015-04-30
        • 1970-01-01
        • 2017-10-12
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2021-08-01
        • 2015-08-10
        相关资源
        最近更新 更多