首页 > 解决方案 > 如何将每小时太阳辐射值转换为每天计算的 0 到 1 之间的每小时值

问题描述

我有一个数据框,其中包含9 个月内df每小时 ( df$Datetime) 太阳辐照 ( ) 的数据。df$Irradiance举个例子:

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语言来做,但是,其他方法对我有用。

标签: rdplyrdata.table

解决方案


一个dplyr选项:

df %>%
  group_by(as.Date(Datetime)) %>%
  mutate(LightIntensity = Irradiance/max(Irradiance)) 

推荐阅读