首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas数据帧对GPS坐标进行插值,以便每1秒获得数据

Pandas数据帧对GPS坐标进行插值,以便每1秒获得数据
EN

Stack Overflow用户
提问于 2021-01-14 00:48:25
回答 1查看 174关注 0票数 0

我有一个包含GPS坐标和个人轨迹时间戳的数据集。它看起来是这样的:

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

在我的研究中,我每1秒需要一次GPS坐标(纬度和经度),所以我想我应该做一次插值,用每种情况下丢失的坐标和时间创建新的数据行。

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

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

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2021-04-07 00:27:37

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

代码语言:javascript
运行
复制
import pandas as pd

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

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

可行的解决方案是:

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

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

代码语言:javascript
运行
复制
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

希望它能帮助你解决你的问题!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65706264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档