【CSV】通过经纬度计算距离并对距离进行筛选

说明

输入:一个CSV文件
输出:一个CSV文件,添加了距离“DSITANCE”字段
编程语言:python
主要使用库:pandas、haversine
自定义参数:输入输出路径、有效经纬度范围、分块大小、距离过滤条件

数据参数说明

名称说明
START_TIME开始时间
START_LAT开始纬度
END_TIME结束时间
END_LNG结束经度
USER_ID用户id
END_LAT结束纬度
START_LNG开始经度

python源码

import os

import pandas as pd
from haversine import haversine, Unit

# 设置输入输出文件
input_path = '../../data/with_distance/data3_wd.csv'
output_path = '../../data_cleaned/data3_cleaned.csv'

# 定义有效经纬度范围
MIN_LNG, MAX_LNG = 113.751647, 114.622924
MIN_LAT, MAX_LAT = 22.400047, 22.855425

# 读取CSV文件,并分块处理,以减少内存使用
chunk_size = 100000  # 可根据您的内存大小调整块的大小
chunks = pd.read_csv(input_path, chunksize=chunk_size)

# 输出文件准备,确保它在追加数据之前是空的
open(output_path, 'w').close()

for df in chunks:
    # 过滤不在经纬度范围内的数据
    df = df[(df['START_LNG'].between(MIN_LNG, MAX_LNG)) & (df['END_LNG'].between(MIN_LNG, MAX_LNG)) &
            (df['START_LAT'].between(MIN_LAT, MAX_LAT)) & (df['END_LAT'].between(MIN_LAT, MAX_LAT))]

    # 计算直线距离
    df['DISTANCE'] = df.apply(lambda row: int(haversine((row['START_LAT'], row['START_LNG']),
                                                    (row['END_LAT'], row['END_LNG']), unit=Unit.METERS)), axis=1)

    # 过滤距离小于200米的数据
    df = df[df['DISTANCE'] >= 200]

    # 追加数据到输出文件,不写入索引,并指定浮点数格式为%.8f
    df.to_csv(output_path, mode='a', index=False, header=not os.path.exists(output_path), float_format='%.8f')

print("处理完成,结果保存在:" + output_path)

效果

执行前

在这里插入图片描述

执行后

注意:因为调用haversine时我使用 int() 强行转换数据类型为int整型,数据类型根据自己的需求调整,距离单位也可以调。
在这里插入图片描述

chunk 函数介绍

【Python】数据处理中的内存优化:chunk 函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值