Как преобразовать почасовые значения солнечного излучения в почасовые значения от 0 до 1, рассчитанные в день - PullRequest
1 голос
/ 01 ноября 2019

У меня есть датафрейм df с данными о часовом (df$Datetime) солнечном облучении (df$Irradiance) в течение 9 месяцев. Например:

df<- data.frame(Datetime=c("2019-07-30 00:00:00","2019-07-30 01:00:00","2019-07-30 02:00:00","2019-07-30 03:00:00","2019-07-30 04:00:00","2019-07-30 05:00:00","2019-07-30 06:00:00","2019-07-30 07:00:00","2019-07-30 08:00:00","2019-07-30 09:00:00","2019-07-30 10:00:00","2019-07-30 11:00:00","2019-07-30 12:00:00","2019-07-30 13:00:00","2019-07-30 14:00:00","2019-07-30 15:00:00","2019-07-30 16:00:00","2019-07-30 17:00:00","2019-07-30 18:00:00","2019-07-30 19:00:00","2019-07-30 20:00:00","2019-07-30 21:00:00"),
                Irradiance=c(0,0,0,0,0,1354,8574,15698,35874,87569,148632,248254,358326,387520,312542,249874,189325,102458,59632,24879,1003,0))

df$Datetime <- as.POSIXct(df$Datetime, format="%Y-%m-%d %H:%M:%S",tz="utz")

df

              Datetime Irradiance
1  2019-07-30 00:00:00          0
2  2019-07-30 01:00:00          0
3  2019-07-30 02:00:00          0
4  2019-07-30 03:00:00          0
5  2019-07-30 04:00:00          0
6  2019-07-30 05:00:00       1354
7  2019-07-30 06:00:00       8574
8  2019-07-30 07:00:00      15698
9  2019-07-30 08:00:00      35874
10 2019-07-30 09:00:00      87569
11 2019-07-30 10:00:00     148632
12 2019-07-30 11:00:00     248254
13 2019-07-30 12:00:00     358326
14 2019-07-30 13:00:00     387520
15 2019-07-30 14:00:00     312542
16 2019-07-30 15:00:00     249874
17 2019-07-30 16:00:00     189325
18 2019-07-30 17:00:00     102458
19 2019-07-30 18:00:00      59632
20 2019-07-30 19:00:00      24879
21 2019-07-30 20:00:00       1003
22 2019-07-30 21:00:00          0

Я хотел бы создать новую переменную с именем LightIntensity, которая колеблется от 0 до 1 каждый день. Час, в течение которого есть максимальная яркость, новое значение для новой переменной будет равно 1, а для часов, где нет яркости, новое значение будет равно 0. Хитрость заключается в том, что яркость меняется в течение года, поэтомуМне нужно рассчитать почасовую LightIntensity по дням.

Ниже приведен пример того, что я ожидал. В этом случае я просто разделил часовую освещенность (df$Datetime) на максимальную освещенность за этот день (387520).

df$LightIntensity <- df$Irradiance/387520

df

              Datetime Irradiance LightIntensity
1  2019-07-30 00:00:00          0    0.000000000
2  2019-07-30 01:00:00          0    0.000000000
3  2019-07-30 02:00:00          0    0.000000000
4  2019-07-30 03:00:00          0    0.000000000
5  2019-07-30 04:00:00          0    0.000000000
6  2019-07-30 05:00:00       1354    0.003494013
7  2019-07-30 06:00:00       8574    0.022125310
8  2019-07-30 07:00:00      15698    0.040508877
9  2019-07-30 08:00:00      35874    0.092573287
10 2019-07-30 09:00:00      87569    0.225972853
11 2019-07-30 10:00:00     148632    0.383546656
12 2019-07-30 11:00:00     248254    0.640622419
13 2019-07-30 12:00:00     358326    0.924664533
14 2019-07-30 13:00:00     387520    1.000000000
15 2019-07-30 14:00:00     312542    0.806518373
16 2019-07-30 15:00:00     249874    0.644802849
17 2019-07-30 16:00:00     189325    0.488555429
18 2019-07-30 17:00:00     102458    0.264394096
19 2019-07-30 18:00:00      59632    0.153881090
20 2019-07-30 19:00:00      24879    0.064200557
21 2019-07-30 20:00:00       1003    0.002588254
22 2019-07-30 21:00:00          0    0.000000000

Однако я не знаю, как это сделать, когда мойдатафрейм занимает более одного дня (в моем случае около 240 дней). Как мне сделать, чтобы создать переменную с именем LightIntensity с учетом максимальной освещенности в день?

Примечание: я бы предпочел научиться делать это с языком data.table, однако другие способы полезныдля меня.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

A dplyr опция:

df %>%
  group_by(as.Date(Datetime)) %>%
  mutate(LightIntensity = Irradiance/max(Irradiance)) 
1 голос
/ 01 ноября 2019

Если вы хотите вычислить LightIntensity по дням, используйте ave.

df2$LightIntensity <- ave(df2$Irradiance, as.Date(df2$Datetime),
                          FUN = function(x) x/max(x))

Данные

Поскольку данные размещены только в вопросепробегает один день, добавлю еще 5 дней. Irradiance похож на первый день.

set.seed(1234)
DT <- df$Datetime + rep(86400, nrow(df))*rep(0:4, each = nrow(df))
Irr <- round(abs(jitter(rep(df$Irradiance, 5))))
df2 <- rbind(df, data.frame(Datetime = DT, Irradiance = Irr))
rm(DT, Irr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...