Как установить подмножество данных, указав c часов интереса? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть набор значений температуры, взятых в указанные c даты и времени в пяти местах. По какой-то причине иногда показания проводятся каждый час, а некоторые - каждые четыре часа. Другая проблема заключается в том, что когда время изменилось в результате перехода на летнее время, показания отключаются на один час. Я заинтересован в показаниях, снятых каждые четыре часа, и хотел бы установить их на дневные и ночные значения, чтобы в итоге получить среднесуточные и ночные средние температуры.

Подводя итог, интересующие меня показания могут быть следующими:

0800, 1200, 1600 =day
2000, 0000, 0400 =night

Записи между 0800-1600 и 2000-0400 каждый день должны быть усреднены.

В дневное время экономия, эквивалентное время:

0900, 1300, 1700 =day
2100, 0100, 0500 =night

Записи между 0900-1700 и 2100-0500 каждый день должны быть усреднены.

В процессе, я надеюсь поднабор по сайтам. Есть также некоторые NA значения или пустые ячейки, которые следует игнорировать.

До сих пор я пытался установить поднабор на один интересный час, просто чтобы посмотреть, сработало ли это, но не продвинулся дальше. , Любые советы о том, как подмножество интересующих вас времен? Спасибо!

temperature <- read.csv("SeaTemperatureData.csv", 
                      stringsAsFactors = FALSE) 
temperature <- subset(temperature, select=-c(X)) #remove last column that contains comments, not needed
temperature$Date.Time < -as.POSIXct(temperature$Date.Time,
                                    format="%d/%m/%Y %H:%M",
                                    tz="Pacific/Auckland")
#subset data by time, we only want to include temperatures recorded at certain times
temperature.goat <- subset(temperature, Date.Time==c('01:00:00'), select=c("Goat.Island"))
            Date.Time Goat.Island Tawharanui  Kawau Tiritiri Noises
1 2019-06-10 16:00:00      16.820     16.892 16.749   16.677 15.819
2 2019-06-10 20:00:00      16.773     16.844 16.582   16.654 15.796
3 2019-06-11 00:00:00      16.749     16.820 16.749   16.606 15.819
4 2019-06-11 04:00:00      16.487     16.796 16.654   16.558 15.796
5 2019-06-11 08:00:00      16.582     16.749 16.487   16.463 15.867
6 2019-06-11 12:00:00      16.630     16.773 16.725   16.654 15.867

1 Ответ

0 голосов
/ 22 апреля 2020

Одним из возможных решений является извлечение часов из переменной DateTime, а затем фильтрация по определенным интересующим часам.

Вот поддельный пример за 4 дня:

library(lubridate)

df <- data.frame(DateTime = seq(ymd_hms("2020-02-01 00:00:00"), ymd_hms("2020-02-05 00:00:00"), by = "hour"),
                 Value = sample(1:100,97, replace = TRUE))

             DateTime Value
1 2020-02-01 00:00:00    99
2 2020-02-01 01:00:00    51
3 2020-02-01 02:00:00    44
4 2020-02-01 03:00:00    49
5 2020-02-01 04:00:00    60
6 2020-02-01 05:00:00    56

Теперь вы можете извлекать часы с помощью функции hour, равной lubridate, и поднабора для нужного часа:

library(lubridate)

subset(df, hour(DateTime) == 5)

              DateTime Value
6  2020-02-01 05:00:00    56
30 2020-02-02 05:00:00    31
54 2020-02-03 05:00:00    65
78 2020-02-04 05:00:00    80

РЕДАКТИРОВАТЬ: получение среднего значения для каждого сайта за подмножество часов

Для запроса OP в комментариях вопрос состоит в том, чтобы вычислить среднее значение для различных сайтов за различный период времени.

Как правило, вы хотите иметь два периода в день, один с 8:00 до 17:00 и другой с 18:00 до 7:00.

Вот более подробный пример, основанный на предыдущем:

df <- data.frame(DateTime = seq(ymd_hms("2020-02-01 00:00:00"), ymd_hms("2020-02-05 00:00:00"), by = "hour"),
                 Site1 = sample(1:100,97, replace = TRUE),
                 Site2 = sample(1:100,97, replace = TRUE))

             DateTime Site1 Site2
1 2020-02-01 00:00:00   100     6
2 2020-02-01 01:00:00     9    49
3 2020-02-01 02:00:00    86    12
4 2020-02-01 03:00:00    34    55
5 2020-02-01 04:00:00    76    29
6 2020-02-01 05:00:00    41     1
....

Итак, теперь вы можете сделать следующее, чтобы обозначить каждый момент времени как день или ночь, а затем сгруппировать по этой категории. для каждого дня и рассчитайте среднее значение для каждого отдельного сайта, используя summarise_at:

library(lubridate)
library(dplyr)

df %>% mutate(Date = date(DateTime),
              Hour= hour(DateTime),
              Category = ifelse(between(hour(DateTime),8,17),"Daily","Night")) %>%
  group_by(Date, Category) %>%
  summarise_at(vars(c(Site1,Site2)), ~ mean(., na.rm = TRUE))

# A tibble: 9 x 4
# Groups:   Date [5]
  Date       Category Site1 Site2
  <date>     <chr>    <dbl> <dbl>
1 2020-02-01 Daily     56.9  63.1
2 2020-02-01 Night     58.9  46.6
3 2020-02-02 Daily     54.5  47.6
4 2020-02-02 Night     36.9  41.7
5 2020-02-03 Daily     42.3  56.9
6 2020-02-03 Night     44.1  55.9
7 2020-02-04 Daily     54.3  50.4
8 2020-02-04 Night     54.8  34.3
9 2020-02-05 Night     75    16  

. Отвечает ли он на ваш вопрос?

...