我有一个包含GPS坐标和个人轨迹时间戳的数据集。它看起来是这样的:
数据是用智能手机应用程序记录的,它被设计为每秒收集数据,正如你在图像中看到的那样。但是,正如您还注意到的,在某些情况下(由于gps错误或卫星连接),数据是在较长的时间内收集的(在图中,第一个时间差为2秒,但在某些情况下甚至更长,为4-5秒或更长)。
在我的研究中,我每1秒需要一次GPS坐标(纬度和经度),所以我想我应该做一次插值,用每种情况下丢失的坐标和时间创建新的数据行。
我已经调查了很长时间,但我找不到任何方法来做这件事。我的想法是首先创建具有"NaN“值的行,对它们进行重新索引,然后使用插值函数df.interpolate()填充纬度、经度和时间列。但是我想不出该怎么做.
如果有人对如何做到这一点有任何想法,那将对我有很大的帮助。
非常感谢。
发布于 2021-04-07 00:27:37
基本上,在resampling时间之后,为了每秒都有一行,重新索引是必要的,因为您当前的索引将不再具有代表性。在数据帧上调用.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的interpolate功能执行线性插值,而GPS系统是球面坐标系。在this answer上可以找到一个很好的解释。
可行的解决方案是:
您可以在this answer中找到更多详细信息。作为一个简短的实现:
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
希望它能帮助你解决你的问题!
https://stackoverflow.com/questions/65706264
复制相似问题