首页 > 解决方案 > Pandas 数据帧插入 GPS 坐标以便每 1 秒获取一次数据

问题描述

我有一个包含 GPS 坐标和个人轨迹时间戳的数据集。它看起来像这样: 在此处输入图像描述

数据是使用智能手机应用程序记录的,它旨在每秒收集数据,如图所示。但是,正如您还注意到的,在某些情况下(由于 gps 错误或卫星连接),数据是在更长的时间内收集的(例如,图中的第一个时间差为 2 秒,但在某些情况下甚至更长,为 4-5 秒或更长)。

对于我的研究,我需要每 1 秒获取一次 GPS 坐标(纬度和经度),所以我想我会进行插值,创建新的数据行,在每种情况下都缺少坐标和时间。

我已经调查了很长时间,但我找不到任何方法。我的想法是首先创建具有“NaN”值的行,重新索引它们,然后使用插值函数填充纬度、经度和时间列:df.interpolate()。但我不知道该怎么做。

如果有人对如何做到这一点有任何想法,那将对我有很大帮助。

非常感谢。

标签: pythonpandastimestampgpsinterpolation

解决方案


基本上在重新采样时间以便每秒有一行之后,重新索引是必要的,因为您当前的索引将不再具有代表性。调用 .bfill(limit=1)您的数据框,将填充所有插值NaN

import pandas as pd

df.index = pd.to_datetime(df['time'])
df = df.resample(f"1S").bfill(limit=1)
df = df.interpolate()

该解决方案的问题在于,pandas 的插值功能执行线性插值,而 GPS 系统是球坐标系。在这个答案中可以找到一个很好的解释。

一个可行的解决方案是:

  • 找出您的坐标记录在哪个坐标参考系 (CRS) 中(最有可能是 4326)
  • 将它们转换为平面坐标系,例如 27700
  • 对转换后的坐标执行线性插值
  • 将它们重新转换为球形系统并覆盖您的纬度/经度数据框列

您可以在答案中找到更多详细信息。作为一个简短的实现:

from pyproj import Transformer, CRS

transformer = Transformer.from_crs(4326, 27700)
back_transformer = Transformer.from_crs(27700, 4326)
x, y = transformer.transform(df.latitude.values, df.longitude.values)
df['x'] = x
df['y'] = y

df = df.interploate()

lat, lon = back_transformer.transform(df.x.values, df.y.values)
df.latitude = lat
df.longitude = lon

希望它可以帮助您解决您的问题!


推荐阅读