Объединяйте почасовые данные в месячные данные, начиная с формата гггг-мм-дд ч: м в R - PullRequest
0 голосов
/ 23 декабря 2018

Я активно искал решение своего вопроса в R и не нашел ничего, что решило бы мою проблему ...

У меня есть отчет R, который нужно отправить на начало января, используя pepeданные мемов.Я изучаю цену pepe мемов через раз, и тут возникает моя проблема.У меня есть даты в формате yyyy-mm-dd h:m, и я хочу объединить их в средние месячные данные.Я думал о том, чтобы сначала сделать новый файл с моей отметкой времени в формате yyyy-mm, но я не смог этого сделать.Я преуспел при переводе в формат yyyy-mm-dd, но у меня действительно есть проблема, когда я хочу перейти в формат гггг-мм.

Итак, более четко, вот мои два вопроса:

  • Как мне объединить мои 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(голова (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"))

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Использование примеров данных, предоставленных в предыдущем ответе (с дополнительным месяцем, добавленным для демонстрации) вместе с dplyr и anytime

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
0 голосов
/ 23 декабря 2018

Использование данных, воспроизводимых в примечании в конце

1) zoo , преобразует данные в объект зоопарка, агрегируя их одновременно, в класс yearmon.Это даст объект зоопарка Mean с одним средним значением в год / месяц.Вы можете использовать это или преобразовать в data.frame, используя fortify.zoo.Это решение, вероятно, более удобно, чем (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) База 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...