我有一个问题,应用一个复杂的函数来使用一个数据帧,而不是单一的传递值。你知道吗
我编写并测试了以下函数:
def calcTrueWind(cog, sog, appWindDir, appWindSpd, heading):
dtor = np.math.pi / 180 # Degrees to radians conversion
# Convert appWindSpd from m/s to K
#appWindSpd = appWindSpd*1.94384
# Convert navigation coordinates to math angles
mathCourse = 90 - float(cog)
# Keep value between 0 and 360
if mathCourse <=0.0:
mathCourse = mathCourse +360
# Calculate apparant wind direction
appWindDir = float(heading) + float(appWindDir)
# Keep value between 0 and 360
if appWindDir >= 360:
appWindDir = appWindDir-360
# Convert metereological coordinates to math angles
mathDirection = 270 - appWindDir
# Ensure values are between 0 and 360
if mathDirection <= 0:
mathDirection = mathDirection + 360
elif mathDirection > 360:
mathDirection = mathDirection - 360
# Compute East-West vector
x = (float(appWindSpd) * np.math.cos(mathDirection * dtor)) + (float(sog) * np.math.cos(mathCourse * dtor))
# Compute North-South vector
y = (float(appWindSpd) * np.math.sin(mathDirection * dtor)) + (float(sog) * np.math.sin(mathCourse * dtor))
# Use the two vector components to calculate the true wind speed
trueWindSpeed = np.math.sqrt((x*x)+(y*y))
calm_flag = 1.0
# Determine true wind angle
if (abs(y) > 0.00001):
mathDirection = (np.math.atan2(y,x))/dtor
else:
if abs(y) > 0.00001:
mathDirection = 180 - (90*y)/abs(y)
else:
mathDirection = 270.0
calm_flag = 0.0
trueWindDirection = 270 - mathDirection
# 0 - 360 boundary check
if trueWindDirection < 0.0:
trueWindDirection = (trueWindDirection + 360)*calm_flag
if trueWindDirection > 360:
trueWindDirection = (trueWindDirection - 360)*calm_flag
# Round before returning values
trueWindSpeed = round(trueWindSpeed,1)
trueWindDirection = round(trueWindDirection,1)
return[trueWindSpeed, trueWindDirection]
我通过传递如下示例值来测试函数:
tws, twd = calcTrueWind( 247.3, 10.5 , 110.3, 21.6, 244.2)
print "trueWindSpeed: " + str(tws)
print "trueWindDirection: " + str(twd)
我现在正在尝试将此函数应用于一个数据帧。你知道吗
数据帧的示例如下所示:
date_time_stamp | fld_courseOverGround | fld_speedOverGround | fld_appWindDirection | fld_appWindSpeed | fld_heading | fld_trueWindSpeed | fld_trueWindDirection
-----------------------+----------------------+---------------------+----------------------+-------------------+-------------+-------------------+----------------------
0 |2017-04-05 07:35:09 | 308.05 | 0.00 | 358 | 1.9 |315.5 | |
1 |2017-04-05 07:35:12 | 333.06 | 0.00 | 359 | 1.9 |315.4 | |
2 |2017-04-05 07:35:17 | 254.68 | 0.01 | 000 | 1.8 |315.4 | |
应将前5列传递给函数,并使用apply函数计算dataframe的最后两列。你知道吗
这就是我尝试过的:
df_truewindtmp['fld_trueWindSpeed'], df_truewindtmp['fld_trueWindSpeed'] = df_truewindtmp.apply(
lambda row: calcTrueWind(row['fld_courseOverGround'],
row['fld_speedOverGround'],
row['fld_appWindDirection'],
row['fld_appWindSpeed'],
row['fld_heading']
), axis=1)
从而导致以下错误: ValueError:传递值的形状是(10,2),索引意味着(10,8)
任何指点都将不胜感激。你知道吗
我认为你可以改变:
收件人:
然后:
样品:
相关问题 更多 >
编程相关推荐