Python 转换为datetime对象会导致numpy函数崩溃

Python 转换为datetime对象会导致numpy函数崩溃,python,numpy,Python,Numpy,我的python脚本产生了一个奇怪的错误,我不知道为什么。也许其他人都有主意。 尝试提供一个其他人都应该能够运行的示例 import datetime import numpy as np date = np.array([20120203123054, 20120204123054]) #date format: YYYYMMDDhhmmss longitude = np.array([52., 53.]) latitude = np.array([-22.0, -23.0]) # Lo

我的python脚本产生了一个奇怪的错误,我不知道为什么。也许其他人都有主意。 尝试提供一个其他人都应该能够运行的示例

import datetime 
import numpy as np

date = np.array([20120203123054, 20120204123054]) #date format: YYYYMMDDhhmmss
longitude = np.array([52., 53.])
latitude = np.array([-22.0, -23.0])

# Loop to convert date into datetime object 
date_new = []
for j in range(len(date)):  
    date_string = str(date[j])
    dt=datetime.datetime.strptime(date_string[:],'%Y%m%d%H%M%S')
    date_new.append(dt) 

data = np.array([date, longitude, latitude]) 
data_new = np.array([date_new, longitude, latitude]) 

#function to calculate distance between two locations (fixed location: 
#longitude=50.,latitude=-20.)
def calculate_distance(longi, lati):
    distance = []
    latitude = ((50. + lati)/2)* 0.01745
    dx = 111.3 * np.cos(latitude) * (50. - longi)
    dy = 111.3 * (-20. - lati)
    d = np.sqrt(dx * dx + dy * dy)
    distance.append(d)  
    return distance

#call function
calculate_distance(data[1], data[2]) # Script works!
calculate_distance(data_new[1], data_new[2]) # Script doesn't work!  
                                             # see Traceback below
为什么会崩溃

Traceback(most recent call last):
File "data_analysis.py" line 85,
dx = 111.3 * cos(latitude) * (lon_station - longitude)
AttributeError: cos

numpy
数组不能很好地处理异构类型。当您创建新的
data\u
时,您在其中存储了不同种类的Python对象,因此迫使
dtype
成为
object
足够宽,可以处理所有内容

>>> data
array([[  2.01202031e+13,   2.01202041e+13],
       [  5.20000000e+01,   5.30000000e+01],
       [ -2.20000000e+01,  -2.30000000e+01]])
>>> data.dtype
dtype('float64')
>>> data_new
array([[datetime.datetime(2012, 2, 3, 12, 30, 54),
        datetime.datetime(2012, 2, 4, 12, 30, 54)],
       [52.0, 53.0],
       [-22.0, -23.0]], dtype=object)
>>> data_new.dtype
dtype('O')
由于获取任意对象的余弦没有意义,因此没有实现:

>>> np.cos(data[1])
array([-0.16299078, -0.91828279])
>>> np.cos(data_new[1])
Traceback (most recent call last):
  File "<ipython-input-87-00101e4be00a>", line 1, in <module>
    np.cos(data_new[1])
AttributeError: cos

FWIW在处理这种混合类型的数据时,我更喜欢数据帧,但人们的偏好各不相同。我对numpy结构化数组了解不够,不知道您是否可以混合对象数据类型和更原始的数据类型,尽管我不这么认为。

请提供。在没有SSCCE的情况下,这只是一个猜测,但您的数组可能有
dtype=object
>>> np.cos(data_new[1].astype(float))
array([-0.16299078, -0.91828279])