Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅具有条件语句的两个连续行的平均值_Python_Pandas_Dataframe - Fatal编程技术网

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
列只有日出和日落值

coorect
new_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