python - Pandas 数据帧插入 GPS 坐标以便每 1 秒获取一次数据
问题描述
我有一个包含 GPS 坐标和个人轨迹时间戳的数据集。它看起来像这样:
数据是使用智能手机应用程序记录的,它旨在每秒收集数据,如图所示。但是,正如您还注意到的,在某些情况下(由于 gps 错误或卫星连接),数据是在更长的时间内收集的(例如,图中的第一个时间差为 2 秒,但在某些情况下甚至更长,为 4-5 秒或更长)。
对于我的研究,我需要每 1 秒获取一次 GPS 坐标(纬度和经度),所以我想我会进行插值,创建新的数据行,在每种情况下都缺少坐标和时间。
我已经调查了很长时间,但我找不到任何方法。我的想法是首先创建具有“NaN”值的行,重新索引它们,然后使用插值函数填充纬度、经度和时间列:df.interpolate()。但我不知道该怎么做。
如果有人对如何做到这一点有任何想法,那将对我有很大帮助。
非常感谢。
解决方案
基本上在重新采样时间以便每秒有一行之后,重新索引是必要的,因为您当前的索引将不再具有代表性。调用 .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
希望它可以帮助您解决您的问题!
推荐阅读
- javascript - 如何在 iOS 手机上使用鼠标悬停链接
- c++ - 使用一个 for 循环如何迭代和测试迭代器值?
- javascript - 将原始数据转换为图形就绪数据
- php - Laravel 雄辩选择 1:n 到 1:1
- wordpress - woocommerce重定向到结帐不起作用
- python - Deploying python with docker, images too big
- android - Firebase recyclerview 适配器分页
- java - 如何从使用 Java 反射 API 调用的方法中检索对象?
- java - 在 jstl sql:query 中使用 java 变量
- javascript - 具有多种颜色的 Google 图表网格背景