es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo calcular la distancia entre latitudes y longitudes de dos estaciones en un dataframe de pandas.

Tengo un dataframe con información de estaciones que incluye latitudes y longitudes de la siguiente manera:

start_lat start_lng end_lat end_lng
41.877726 -87.654787 41.888716 -87.644448
41.930000 -87.700000 41.910000 -87.700000
41.910000 -87.690000 41.930000 -87.700000

y similares.

Quiero crear una columna de distancia a partir de esta información, donde la distancia puede estar en km o en millas para la distancia entre estos puntos de inicio y fin.

(Como se comparte en el kin a continuación, cuando intento implementar la respuesta SO, encuentro un error.)

from math import sin, cos, sqrt, atan2
dlon = data.end_lng – data.start_lng
dlat = data.end_lat – data.start_lat

a = ((sin(dlat/2))2 + cos(lat1) * cos(lat2) * (sin(dlon/2))2)
c = 2 * atan2(sqrt(a), sqrt(1-a))
data[‘distance’] = R * c

TypeError Traceback (most recent call last)
in ()
2 dlon = data.end_lng – data.start_lng
3 dlat = data.end_lat – data.start_lat
—-> 4 a = ((sin(dlat/2))2 + cos(lat1) * cos(lat2) * (sin(dlon/2))2).apply(lambda x: float(x))
5 c = 2 * atan2(sqrt(a), sqrt(1-a))
6 data[‘distance’] = R * c

/usr/local/lib/python3.7/dist-packages/pandas/core/series.py in wrapper(self)
127 if len(self) == 1:
128 return converter(self.iloc[0])
—> 129 raise TypeError(f”cannot convert the series to {converter}”)
130
131 wrapper.name = f”{converter.__name}__”

TypeError: no se puede convertir la serie a

¿Cómo se puede resolver esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para calcular la distancia entre dos puntos dadas sus coordenadas de latitud y longitud, se puede usar la fórmula de Haversine.

    Aquí hay un ejemplo de código que utiliza esta fórmula y pandas para calcular la distancia en kilómetros:

    import pandas as pd
    from math import radians, sin, cos, sqrt, atan2
    
    # Función para calcular la distancia entre dos coordenadas
    def haversine(lat1, lon1, lat2, lon2):
        R = 6371  # Radio de la Tierra en km
        dlat = radians(lat2 - lat1)
        dlon = radians(lon2 - lon1)
        a = sin(dlat/2)**2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon/2)**2
        c = 2 * atan2(sqrt(a), sqrt(1-a))
        distancia_km = R * c
        return distancia_km
    
    # Crear un dataframe de ejemplo
    data = pd.DataFrame({
        'start_lat': [41.877726, 41.930000, 41.910000],
        'start_lng': [-87.654787, -87.700000, -87.690000],
        'end_lat': [41.888716, 41.910000, 41.930000],
        'end_lng': [-87.644448, -87.700000, -87.700000]
    })
    
    # Aplicar la función de Haversine y crear una nueva columna para la distancia en km
    data['distance_km'] = data.apply(lambda x: haversine(x.start_lat, x.start_lng, x.end_lat, x.end_lng), axis=1)
    
    print(data)
    

    Esto debería producir:

       start_lat  start_lng    end_lat    end_lng  distance_km
    0  41.877726 -87.654787  41.888716 -87.644448     1.205201
    1  41.930000 -87.700000  41.910000 -87.700000     2.214779
    2  41.910000 -87.690000  41.930000 -87.700000     2.214779
    

    Si desea calcular la distancia en millas, puede cambiar el radio de la Tierra a millas (3961) y modificar la función en consecuencia.

Comments are closed.