说明
输入:一个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整型,数据类型根据自己的需求调整,距离单位也可以调。