Python实现经纬度度分合并及进位/退位转换为十进制度
特殊CSV地理数据的经纬度转换方案
需求说明
处理包含timestamp、lat_minutes(浮点型)、long_minutes(浮点型)列的CSV地理数据,已知起始纬度为45°、起始经度为75°,需将分钟列与起始度数结合转换为十进制度格式,同时处理两种特殊情况:
- 分钟值累计逻辑上超过60时自动进1度
- 分钟值从接近0跳至59.xx时自动退1度
原始数据示例
import pandas as pd lat = 45 long = 75 data = { 'time': [ '2024-03-27 12:00:00', '2024-03-27 12:00:01', '2024-03-27 12:00:02', '2024-03-27 12:00:03', '2024-03-27 12:00:04', '2024-03-27 12:00:05' ], 'lat_minutes': [ 59.9955, 59.9963, 0.0180, 0.0230, 0.0050, 59.6500 ], 'long_minutes': [ 59.0250, 59.0750, 0.0020, 0.1850, 0.0750, 59.075 ] } df = pd.DataFrame(data)
转换实现代码
核心逻辑是通过识别分钟序列的跳变,累计度数偏移量,再结合起始度数和分钟转十进制的结果得到最终经纬度:
def convert_minutes_to_degrees(base_degree, minutes_series): # 计算相邻分钟的差值 diffs = minutes_series.diff().fillna(0) offset = 0 offsets = [0] for diff in diffs[1:]: # 差值小于-59,说明从接近0跳回59区间,需退1度 if diff < -59: offset -= 1 # 差值大于59,说明从接近60跳至0区间,需进1度 elif diff > 59: offset += 1 offsets.append(offset) # 计算最终十进制度数:起始度数 + 偏移量 + 分钟/60 return base_degree + pd.Series(offsets) + minutes_series / 60 # 生成目标列 df['Latitude'] = convert_minutes_to_degrees(lat, df['lat_minutes']) df['Longitude'] = convert_minutes_to_degrees(long, df['long_minutes']) # 对齐示例的小数位数 df['Latitude'] = df['Latitude'].round(6) df['Longitude'] = df['Longitude'].round(6)
转换后结果
time lat_minutes long_minutes Latitude Longitude 0 2024-03-27 12:00:00 59.9955 59.0250 45.999925 75.983750 1 2024-03-27 12:00:01 59.9963 59.0750 45.999938 75.984583 2 2024-03-27 12:00:02 0.0180 0.0020 46.000300 76.000033 3 2024-03-27 12:00:03 0.0230 0.1850 46.000383 76.003083 4 2024-03-27 12:00:04 0.0050 0.0750 46.000083 76.001250 5 2024-03-27 12:00:05 59.6500 59.0750 45.994167 75.984583
内容的提问来源于stack exchange,提问作者MT Ring
相关产品推荐
相关产品推荐

