首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要python熊猫的数据类型错误浮动

需要python熊猫的数据类型错误浮动
EN

Stack Overflow用户
提问于 2014-11-21 21:47:26
回答 2查看 869关注 0票数 0

我试图从csv文件中读取数据,并从coordinates.But中计算方位--我得到了“需要浮动”的错误。如果我只在两个坐标下单独运行该函数(而不是使用循环),该函数本身就能工作。因此,我认为这个问题与最后的“for”声明有关。我想知道是否有人知道我应该在哪里以及如何设置浮点数据类型?谢谢。

代码语言:javascript
复制
from math import *
import pandas as p
import numpy as np

bearingdata = 'xxxxxx.csv'
data = p.read_csv(bearingdata)

lat = [float(i) for i in data.Lat]
lon = [float(j) for j in data.Lon]

lat1 = lat[0: (len(lat) -2)]
lon1 = lon[0: (len(lon) -2)]
lat2 = lat[1: (len(lat) -1)]
lon2 = lon[1: (len(lon) -1)]

def bearing(lon_1, lat_1, lon_2, lat_2):

    # convert decimal degrees to radians 
        lon_1, lat_1, lon_2, lat_2 = map(radians, [lon_1, lat_1, lon_2, lat_2])

    #now calcuate bearing   

    Bearing = atan2(cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1),sin(lon2-lon1)*cos(lat2))
    Bearing = degrees(Bearing)
    Bearing = (Bearing + 360) % 360

    return Bearing   

count = 0
for x in lat1:
    print str(count) + "\n"

    angle = bearing(lon1[count], lat1[count], lon2[count], lat2[count])
    print "the bearing between " + str(lat1[count]) + "," + str(lon1[count]) + " and " + str(lat2[count]) + "," + str(lon2[count]) + " is: " + str(angle) + "degrees \n"   
    count = count + 1

* trace *

代码语言:javascript
复制
Traceback (most recent call last):<br>
File "bearing.py", line 34, in <module><br>
angle = bearing(lon1[count], lat1[count], lon2[count], lat2[count])<br>
File "bearing.py", line 23, in bearing<br>
Bearing = atan2(cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1),sin(lon2-lon1)*cos(lat2))<br>
TypeError: a float is required

*原始数据看起来如下*

Lat (列名)

42.xxxxxx

..。多行

栏名

78.xxxx

..。多行

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 23:04:28

你几乎从来不需要在熊猫里转圈。试着做这样的事情:

生成一些假坐标

代码语言:javascript
复制
import pandas
import numpy as np

N = 10
np.random.seed(0)
degree_data = pandas.DataFrame({
    'lat': np.random.uniform(low=-90, high=90, size=N),
    'lon': np.random.uniform(low=-180, high=180, size=N),
})

degree_data看起来是这样的:

代码语言:javascript
复制
         lat         lon
0   8.786431  105.021014
1  38.734086   10.402171
2  18.497408   24.496042
3   8.078973  153.214790
4 -13.742136 -154.427019
5  26.260940 -148.633452
6 -11.234302 -172.721377
7  70.519140  119.743144
8  83.459297  100.136430
9 -20.980527  133.204373

转换成弧形,把所有的东西向上移动一排,这样我们就可以向前看了。

代码语言:javascript
复制
radian_data = np.round(np.radians(degree_data), 2)
radian_data = radian_data.join(radian_data.shift(-1), lsuffix='1', rsuffix='2')
print(radian_data)

所以现在radian_data是:

代码语言:javascript
复制
   lat1  lon1  lat2  lon2
0  0.15  1.83  0.68  0.18
1  0.68  0.18  0.32  0.43
2  0.32  0.43  0.14  2.67
3  0.14  2.67 -0.24 -2.70
4 -0.24 -2.70  0.46 -2.59
5  0.46 -2.59 -0.20 -3.01
6 -0.20 -3.01  1.23  2.09
7  1.23  2.09  1.46  1.75
8  1.46  1.75 -0.37  2.32
9 -0.37  2.32   NaN   NaN

定义一个从数据中取行的轴承函数。

代码语言:javascript
复制
def bearing(row):
    x = np.cos(row.lat1)*np.sin(row.lat2) - \
        np.sin(row.lat1)*np.cos(row.lat2)*np.cos(row.lon2-row.lon1)
    y = np.sin(row.lon2-row.lon1)*np.cos(row.lat2)
    Bearing = np.degrees(np.arctan2(x, y))
    return (Bearing + 360) % 360

函数到每一行的apply,保存在原始数据帧中。

代码语言:javascript
复制
degree_data['bearing'] = radian_data.apply(bearing, axis=1)
# so now we have 
         lat         lon     bearing
0   8.786431  105.021014  140.855914
1  38.734086   10.402171  305.134809
2  18.497408   24.496042   22.751374
3   8.078973  153.214790  337.513363
4 -13.742136 -154.427019   81.301311
5  26.260940 -148.633452  235.214299
6 -11.234302 -172.721377  108.063240
7  70.519140  119.743144   98.957144
8  83.459297  100.136430  301.528278
9 -20.980527  133.204373         NaN
票数 0
EN

Stack Overflow用户

发布于 2014-11-21 22:03:18

在函数中向数学中添加一个小数点:

代码语言:javascript
复制
Bearing = (Bearing + 360) % 360.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27070933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档