【问题标题】:Aggregate hourly data into monthly data starting with the yyyy-mm-dd h:m format in R从 R 中的 yyyy-mm-dd h:m 格式开始,将每小时数据聚合成每月数据
【发布时间】:2019-05-23 02:53:15
【问题描述】:

我一直在积极寻找 R 中我的问题的解决方案,但没有找到任何可以解决我的问题的方法...

我有一份 R 报告要在 1 月初提交,使用的是 pepe memes 数据。我正在研究佩佩模因的价格,我的问题来了。我有yyyy-mm-dd h:m 格式的日期,我想将这些日期汇总为月度数据。我正在考虑首先制作一个新文件,我的时间戳格式为yyyy-mm,但我无法做到这一点。我在翻译成yyyy-mm-dd 格式时是成功的,但是当我想转到 yyyy-mm 格式时我真的遇到了问题。

所以,更清楚的是,这是我的两个问题:

  • 如何将我的yyyy-mm-dd h:m 日期与每月数据的平均值汇总为每月日期(因此,格式为yyyy-mm)?

  • 如果您不知道如何直接聚合日期,有没有人知道如何从 yyyy-mm-dd h:m 格式转到 yyyy-mm 格式?

这是我的数据集的一些行(只是一个摘要,它包含超过 250 行):

   Timestamp           ForwardQuantity TotalPriceUSDPerUnit
------------------------------------------------------------
 1 2016-09-26 04:00:00               3                 3.44
 2 2016-09-26 04:00:00               7                 3.44
 3 2016-09-26 05:00:00               3                 3.39
 4 2016-09-26 05:00:00               1                 3.39
 5 2016-09-26 06:00:00               2                 3.39
 6 2016-09-26 13:00:00               4                 2.84
 7 2016-09-28 04:00:00               1                 2.88
 8 2016-09-28 04:00:00               1                 2.92
 9 2016-09-28 06:00:00               1                 2.92
10 2016-09-28 06:00:00               1                 2.92 

在此先多谢了,祝各位庆祝圣诞节愉快!

编辑:预期结果:

   Timestamp           Average price
 ------------------------------------
 1 2016-09               2.9981 

这里的平均价格是通过将上面的远期数量乘以它的相关价格得到的

编辑 2:dput(head(DatasHAIRPEPE3col, 10)) 的输出如下

    structure(list(Timestamp = structure(c(1474862400, 1474862400, 
1474866000, 1474866000, 1474869600, 1474894800, 1475035200, 1475035200, 
1475042400, 1475042400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    ForwardQuantity = c(3L, 7L, 3L, 1L, 2L, 4L, 1L, 1L, 1L, 1L
    ), TotalPriceUSDPerUnit = c(3.445, 3.445, 3.392, 3.392, 3.392, 
    2.8352, 2.8795, 2.9238, 2.9238, 2.9238)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r datetime


    【解决方案1】:

    使用末尾注释中可重复显示的数据

    1) zoo 将数据转换为 zoo 对象,同时将其聚合到类 yearmon。这将给一个动物园对象Mean 每年/每月一个平均值。您可以使用它,也可以使用 fortify.zoo 将其转换为 data.frame。这个解决方案可能比下面的 (2) 更方便,因为我们直接将年/月表示为 yearmon 类对象,可以以逻辑方式绘制和操作。

    library(zoo)
    Mean <- read.zoo(DF, FUN = as.yearmon, aggregate = mean)
    fortify.zoo(Mean)  # optional
    

    给出这个数据框:

         Index     Mean
    1 Sep 2016 3.406667
    

    您现在可以进一步操作,例如像这样使用plot.zoo 绘制它:

    plot(Mean)
    

    2) Base R 或者,使用每个时间戳的前 7 个字符来表示年/月并以此进行汇总。

    DF2 <- transform(DF, Timestamp = substring(Timestamp, 1, 7))
    aggregate(UsdPricePerUnit ~ Timestamp, DF2, mean)
    

    给予:

      Timestamp UsdPricePerUnit
    1   2016-09        3.406667
    

    注意

    Lines <- "
    Timestamp                    UsdPricePerUnit
    2016-09-26 04:00:00                 3.44
    2016-09-26 04:00:00                 3.44
    2016-09-26 05:00:00                 3.39
    2016-09-26 05:00:00                 3.39
    2016-09-26 05:00:00                 3.39
    2016-09-26 06:00:00                 3.39"
    DF <- read.csv(textConnection(gsub("  +", ",", Lines)))
    

    【讨论】:

    • 你好!非常感谢您的回答,但是当我输入 Mean
    • 我也尝试了第二种方法,但我给了我每小时的平均值,而不是每月的平均值......如果你知道如何解决这个问题,请告诉我!!
    • 将输入的内容复制粘贴到最后的Note中,然后复制粘贴代码。没有错误或警告,也没有按小时给出结果。您必须弄清楚您的实际数据(我们没有)与您在问题中显示的数据有何不同。
    • 我只是做了它,但它不起作用......但如果它有帮助,我的数据类是“POSIXct”“POSIXt”作为我的时间戳,整数表示我的转发数量和数字每单位总美元价格
    • 不幸的是,您没有执行我在评论中描述的操作,因为注释中的时间戳不是 POSIXct,问题中也没有这样描述。这就是我以可重现的形式提供它的原因——所以不可能有任何不确定性。
    【解决方案2】:

    使用上一个答案中提供的示例数据(为演示添加了额外的一个月)以及dplyranytime

    library(tidyverse)
    library(anytime)
    
    Lines <- "
    Timestamp               ForwardQuantity         UsdPricePerUnit
    2016-09-26 04:00:00     3                 3.44
    2016-09-26 04:00:00     7                 3.44
    2016-09-26 05:00:00     3                 3.39
    2016-10-26 05:00:00     1                 3.39
    2016-10-26 05:00:00     2                 3.39
    2016-10-26 06:00:00     4                 3.39"
    
    DF <- read.csv(textConnection(gsub("  +", ",", Lines)))
    DF %>%
      mutate(month = format(anydate((Timestamp)), "%Y-%m")) %>%
      group_by(month) %>%
      mutate(MonthlySpend = ForwardQuantity*UsdPricePerUnit) %>%
      summarise(QuanPerMon = sum(ForwardQuantity),
                SpendPerMon = sum(MonthlySpend)) %>%
      mutate(AveragePrice = SpendPerMon/QuanPerMon) %>%
      select(1,4)
    
    # A tibble: 2 x 2
      month   AveragePrice
      <chr>          <dbl>
    1 2016-09         3.43
    2 2016-10         3.39
    

    编辑 - 新数据添加到问题

    这对我有用你的数据

    df %>%
      mutate(month = format(anydate((Timestamp)), "%Y-%m")) %>%
      group_by(month) %>%
      mutate(MonthlySpend = ForwardQuantity*TotalPriceUSDPerUnit) %>%
      summarise(QuanPerMon = sum(ForwardQuantity),
                SpendPerMon = sum(MonthlySpend)) %>%
      mutate(AveragePrice = SpendPerMon/QuanPerMon) %>%
      select(1,4)
    
    # A tibble: 1 x 2
      month   AveragePrice
      <chr>          <dbl>
    1 2016-09         3.24
    

    【讨论】:

    • 您好!非常感谢,但我编辑了我的帖子,并且需要考虑转发数量......知道如何做到这一点吗?
    • 你想对正向数量数据做什么?
    • 好吧,我需要它的平均价格。前向数据对应于给定时间戳的模因交换数量,因此几乎所有变化
    • 好的,我只是在我的第一篇文章中(在编辑之后)中做到了。谢谢 !但是不用担心,如果我必须有一个新专栏,我会哈哈
    • Okkkkk 我终于做到了!!!好吧,你确实做到了,我只是根据我的数据对其进行了调整。非常感谢男人(或女人)你救了我的命!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多