Python 仅具有条件语句的两个连续行的平均值
在搜索了类似的问题后,我发现了和问题。不幸的是,他们俩都不适合我 第一个适用于所有列,第二个不适用于我的Python 仅具有条件语句的两个连续行的平均值,python,pandas,dataframe,Python,Pandas,Dataframe,在搜索了类似的问题后,我发现了和问题。不幸的是,他们俩都不适合我 第一个适用于所有列,第二个不适用于我的True和False列,并返回错误(我也没有完全理解它) 以下是问题的描述: 我正在使用约54k行的数据帧。以下是24个值的示例: +----+---------------------+---------------------+----------------------+--------------------+-------+ | | date |
True
和False
列,并返回错误(我也没有完全理解它)
以下是问题的描述:
我正在使用约54k行的数据帧。以下是24个值的示例:
+----+---------------------+---------------------+----------------------+--------------------+-------+
| | date | omegasr | omega | omegass | isday |
+----+---------------------+---------------------+----------------------+--------------------+-------+
| 1 | 2012-03-27 00:00:00 | -1.5707963267948966 | -3.32335035194977 | 1.5707963267948966 | False |
| 2 | 2012-03-27 01:00:00 | -1.5707963267948966 | -3.0615509641506207 | 1.5707963267948966 | False |
| 3 | 2012-03-27 02:00:00 | -1.5707963267948966 | -2.799751576351471 | 1.5707963267948966 | False |
| 4 | 2012-03-27 03:00:00 | -1.5707963267948966 | -2.5379521885523215 | 1.5707963267948966 | False |
| 5 | 2012-03-27 04:00:00 | -1.5707963267948966 | -2.2761528007531724 | 1.5707963267948966 | False |
| 6 | 2012-03-27 05:00:00 | -1.5707963267948966 | -2.014353412954023 | 1.5707963267948966 | False |
| 7 | 2012-03-27 06:00:00 | -1.5707963267948966 | -1.7525540251548732 | 1.5707963267948966 | False |
| 8 | 2012-03-27 07:00:00 | -1.5707963267948966 | -1.4907546373557239 | 1.5707963267948966 | True |
| 9 | 2012-03-27 08:00:00 | -1.5707963267948966 | -1.2289552495565745 | 1.5707963267948966 | True |
| 10 | 2012-03-27 09:00:00 | -1.5707963267948966 | -0.9671558617574253 | 1.5707963267948966 | True |
| 11 | 2012-03-27 10:00:00 | -1.5707963267948966 | -0.7053564739582756 | 1.5707963267948966 | True |
| 12 | 2012-03-27 11:00:00 | -1.5707963267948966 | -0.44355708615912615 | 1.5707963267948966 | True |
| 13 | 2012-03-27 12:00:00 | -1.5707963267948966 | -0.1817576983599767 | 1.5707963267948966 | True |
| 14 | 2012-03-27 13:00:00 | -1.5707963267948966 | 0.08004168943917273 | 1.5707963267948966 | True |
| 15 | 2012-03-27 14:00:00 | -1.5707963267948966 | 0.34184107723832213 | 1.5707963267948966 | True |
| 16 | 2012-03-27 15:00:00 | -1.5707963267948966 | 0.6036404650374716 | 1.5707963267948966 | True |
| 17 | 2012-03-27 16:00:00 | -1.5707963267948966 | 0.8654398528366211 | 1.5707963267948966 | True |
| 18 | 2012-03-27 17:00:00 | -1.5707963267948966 | 1.127239240635771 | 1.5707963267948966 | True |
| 19 | 2012-03-27 18:00:00 | -1.5707963267948966 | 1.3890386284349199 | 1.5707963267948966 | True |
| 20 | 2012-03-27 19:00:00 | -1.5707963267948966 | 1.6508380162340692 | 1.5707963267948966 | False |
| 21 | 2012-03-27 20:00:00 | -1.5707963267948966 | 1.9126374040332188 | 1.5707963267948966 | False |
| 22 | 2012-03-27 21:00:00 | -1.5707963267948966 | 2.174436791832368 | 1.5707963267948966 | False |
| 23 | 2012-03-27 22:00:00 | -1.5707963267948966 | 2.4362361796315177 | 1.5707963267948966 | False |
| 24 | 2012-03-27 23:00:00 | -1.5707963267948966 | 2.698035567430667 | 1.5707963267948966 | False |
+----+---------------------+---------------------+----------------------+--------------------+-------+
omega
是以弧度为单位的太阳时角。在00:00和24:00时,其范围分别为-pi/2到+pi/2。中午时,其值为0
omegass
是日落发生的小时角度。由于太阳-地球系统的对称性,omegasr=-omegass
。这些值在一天内保持不变,但每天都在变化
列isday
是一个条件表达式的结果:当omegasr
时,它是一天,可以进行进一步的计算
为了进行进一步的计算,我需要将度量所涵盖的时间跨度的中点与每小时相关联。例如,正午测量值记录在12:00,但是为了表示所有的时间,我想要12:30的时间角。所以我需要一个
omegam[i] = (omega[i],omega[i+1]).mean()
其中i
表示索引
但这里出现了一个新问题:如果日落发生在早上6:40,那么中点时间必须这样计算:
omegam[i] = (omegasr[i],omega[i+1]).mean() #sunrise
omegam[i] = (omega[i],omegass[i+1]).mean() #sunset
因此,每小时弧度角将对应于上午6:50。我创建了列isday
,以帮助执行此任务,但不幸的是,我无法真正使用它
多谢各位
编辑:
@Mabel Villaba提出的解决方案是不正确的,因为new_omega
列只有日出和日落值
coorectnew_omega
列为:
new_omega
...
7 #here the mean is between omegasr and omega[8], therefore this new_omega value can't have a correct value, according to the proposed solution.
8 -1.2289552495565745 # = omega[9]
9 omega[10] #
10 omega[11]
...
17 omega[18]
18 omega[19]
19 1.570796 #omegass
...
我希望这足够清楚
EDIT2:
再次感谢,但数值仍然不正确:平均值仍然计算错误。我已经手动计算了正确的值,我将在此处发布它们:
omegam
...
7 -1.530775
8 -1.359855
9 -1.098058
...
13 -0.05256705
...
19 1.47992
...
EDIT3:
我认为由于布尔掩码而获得的df['isday']
列可能有误导性
事实上:日出总是发生在两行之间,让它们分别被称为omega1
和omega2
,它们分别属于row1
和row2
。日落时也会发生同样的情况,但对于omega3
和omega4
。发生的情况是,row1
的正确omegam
计算为:
omegam(row1) = (omegasr + omega2)/2
omegam(row3) = (omega3 + omegass)/2
但是isday
列中的row1
hase有一个False
属性
日落时则相反:发生在第3行和第4行之间,计算如下:
omegam(row1) = (omegasr + omega2)/2
omegam(row3) = (omega3 + omegass)/2
并且row3
具有True
属性。EDIT
在你提到的情况下,这有点复杂,但我想我找到了一个解决办法。有一些误导,因为日出和日落时的操作并不总是在同一方向进行
让我们创建两个ω气体,omega1
它的ω[i]=0.5*(ω[i]+omegasr[i+1])和另一个omega2
它的ω[i]=0.5*(ω[i-1]+omegasr[i]):
然后,我们需要制作一个面具,告诉我们是日落还是日出,或者两者都不是:
df['mask'] = (df['isday'] * 1).diff().bfill()
>> df[['date','mask', 'isday']]
date mask isday
0 2012-03-27 00:00:00 0.0 False
1 2012-03-27 01:00:00 0.0 False
2 2012-03-27 02:00:00 0.0 False
3 2012-03-27 03:00:00 0.0 False
4 2012-03-27 04:00:00 0.0 False
5 2012-03-27 05:00:00 0.0 False
6 2012-03-27 06:00:00 0.0 False
7 2012-03-27 07:00:00 1.0 True
8 2012-03-27 08:00:00 0.0 True
9 2012-03-27 09:00:00 0.0 True
10 2012-03-27 10:00:00 0.0 True
11 2012-03-27 11:00:00 0.0 True
12 2012-03-27 12:00:00 0.0 True
13 2012-03-27 13:00:00 0.0 True
14 2012-03-27 14:00:00 0.0 True
15 2012-03-27 15:00:00 0.0 True
16 2012-03-27 16:00:00 0.0 True
17 2012-03-27 17:00:00 0.0 True
18 2012-03-27 18:00:00 0.0 True
19 2012-03-27 19:00:00 -1.0 False
20 2012-03-27 20:00:00 0.0 False
21 2012-03-27 21:00:00 0.0 False
22 2012-03-27 22:00:00 0.0 False
23 2012-03-27 23:00:00 0.0 False
这样,df['mask']==1
对应日出,df['mask']=-1
对应日落,df['mask']==0
对应其余部分
基于这些条件,我们可以创建omegam
:
df['omegam'] = df['omega'].rolling(2).mean() * (df['mask'] == 0) + \
df['omega1'] * (df['mask']==1) + \
df['omega2'] * (df['mask']==-1)
>> df[['date','omegam']]
date omegam
0 2012-03-27 00:00:00 NaN
1 2012-03-27 01:00:00 -3.192451
2 2012-03-27 02:00:00 -2.930651
3 2012-03-27 03:00:00 -2.668852
4 2012-03-27 04:00:00 -2.407052
5 2012-03-27 05:00:00 -2.145253
6 2012-03-27 06:00:00 -1.883454
7 2012-03-27 07:00:00 -1.530775
8 2012-03-27 08:00:00 -1.359855
9 2012-03-27 09:00:00 -1.098056
10 2012-03-27 10:00:00 -0.836256
11 2012-03-27 11:00:00 -0.574457
12 2012-03-27 12:00:00 -0.312657
13 2012-03-27 13:00:00 -0.050858
14 2012-03-27 14:00:00 0.210941
15 2012-03-27 15:00:00 0.472741
16 2012-03-27 16:00:00 0.734540
17 2012-03-27 17:00:00 0.996340
18 2012-03-27 18:00:00 1.258139
19 2012-03-27 19:00:00 1.479917
20 2012-03-27 20:00:00 1.781738
21 2012-03-27 21:00:00 2.043537
22 2012-03-27 22:00:00 2.305336
23 2012-03-27 23:00:00 NaN
旧解决方案:
正如您所提到的,由于
omegasr=-omegass
,因此您可以根据小时在pandas中创建一个新列,以便获得平均操作所需的omega
(如果日出)(这不是完全正确的,我将用new_omega
编辑问题,这将是正确的。修复了它,现在它应该按照你要求的方式工作。棘手的问题!谢谢你,但它仍然不能正确工作:我已经手动完成了计算,在你的解决方案中只是df['omegam')。iloc[19]
采用正确的值。df['omegam'].iloc[8]
也有正确的值,但它应该位于第7位(日出出现在第7行和第8行之间,因此df['omegam']中的omegam
。iloc[7]
是在日出和下一小时开始之间计算的。另外,如果对omega
变为正值的两行进行计算,则会得到df['omegam']。iloc[13]=-0.0525…
好的!问题在于计算和日出日落,这并不总是在同一个方向上进行的,而且,其余时间它是应用欧米茄的平均值。这一次它起作用了!非常感谢,我不知道它会如此棘手!
omegam[i] = (omegasr[i],omega[i+1]).mean() #sunrise
omegam[i] = (omega[i],omegass[i+1]).mean() #sunset
# Calculate the rolling mean with a window=2 and then shift backwards
# (by default pd.rollling(2).mean() would result in
# omegam[i]= mean(omega[i-1], omega[i]))
df['omegam'] = df['omega'].rolling(2).mean().shift(-1)
df['omegam'][df['isday']] = df[['omega', 'new_omega']][df['isday']].mean(axis=1).values
>> df['omegam']
1 -3.192451
2 -2.930651
3 -2.668852
4 -2.407052
5 -2.145253
6 -1.883454
7 -1.621654
8 -1.530775
9 -1.399876
10 -1.268976
11 -1.138076
12 0.563620
13 0.694519
14 0.825419
15 0.956319
16 1.087218
17 1.218118
18 1.349018
19 1.479917
20 1.781738
21 2.043537
22 2.305336
23 2.567136
24 NaN
Name: omegam, dtype: float64