【问题标题】:How to interpolate lat long points in time series using pandas如何使用熊猫在时间序列中插入经纬度点
【发布时间】:2017-07-13 14:47:41
【问题描述】:

我有一个带有日期时间字段、ID 字段和纬度和经度列的熊猫数据框。它描述了随时间推移的移动点:

         Date                               ID           Lat       Lon
2017-07-03 00:03:43  f2d8c21d593adcb5423127923d63c7b3  39.90459 -75.12544
2017-07-03 00:06:49  f2d8c21d593adcb5423127923d63c7b3  39.91282 -75.17551
2017-07-03 00:09:56  f2d8c21d593adcb5423127923d63c7b3  39.93888 -75.19702
2017-07-03 00:13:03  f2d8c21d593adcb5423127923d63c7b3  39.96759 -75.18911
2017-07-03 00:16:09  f2d8c21d593adcb5423127923d63c7b3  40.00141 -75.19462

我的数据框有多个 ID,每个 ID 描述不同的对象。我想要做的是对于每个 ID,通过每秒添加行来填充日期字段中的“空白”,以及对经纬度点移动位置的插值,假设它在乌鸦飞行时移动点之间(不考虑地球曲率)

到目前为止我所拥有的是:

idlist = df['ID'].unique() #create list of all ids
for x in idlist:
    temp = df.loc[df['ID']==x] #iterate of smaller sub-dataframe for each ID
    temp['Date'] = pd.to_datetime(temp['Date'])
    mindate = temp['Date'].min()
    maxdate = temp['Date'].max()
    idx = pd.date_range(mindate, maxdate,freq='s') #create new second index
    temp = temp.set_index('Date')
    temp = temp.reindex(idx, fill_value=0)
    temp.loc[temp['ID']==0, 'TripID'] = x
    print(temp)
    break

这让我在其中的一部分。

                                             TripID       Lat       Lon
2017-07-03 00:03:43  f2d8c21d593adcb5423127923d63c7b3  39.90459 -75.12544
2017-07-03 00:03:44  f2d8c21d593adcb5423127923d63c7b3   0.00000   0.00000
2017-07-03 00:03:45  f2d8c21d593adcb5423127923d63c7b3   0.00000   0.00000
2017-07-03 00:03:46  f2d8c21d593adcb5423127923d63c7b3   0.00000   0.00000
2017-07-03 00:03:47  f2d8c21d593adcb5423127923d63c7b3   0.00000   0.00000
...
2017-07-03 00:16:08  f2d8c21d593adcb5423127923d63c7b3   0.00000   0.00000
2017-07-03 00:16:09  f2d8c21d593adcb5423127923d63c7b3  40.00141 -75.19462

我需要弄清楚如何填写它们等于 0 的纬度和经度位置,以便 ID 似乎在我有数据的点之间沿直线移动。

这是我不确定的部分。任何见解都会有所帮助。 一旦我知道该怎么做,我就可以将所有完成的临时数据帧附加到输出中。

【问题讨论】:

    标签: python pandas interpolation


    【解决方案1】:

    相信你正在寻找方法.ffill()。要准备数据,您必须将 data['Lat']data['Lon'] 上的值设置为等于 NA,以便这些值可以向前填充。

    data.loc[data['Lat'] == 0, 'Lat'] = None
    data.loc[data['Lon'] == 0, 'Lon'] = None #fill NA where equal to zero
    
    data['Lat'] = data['Lat'].ffill()
    data['Lon'] = data['Lon'].ffill() #conversly, data['Lon'].fillna(method = 'ffill') should work
    

    这应该会给出所需的输出 - 如果我误解了这个问题,请发表评论。 pandas API 参考https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html

    【讨论】:

    • 对不起,我没有让自己更清楚。我正在寻找的是填充的 NA 值,就好像 id 在两个已知位置之间移动一样。两个点之间按时间顺序排列的 NA 点也应该在地理上处于中间位置。
    猜你喜欢
    • 2018-06-26
    • 2022-12-06
    • 2019-08-10
    • 2022-11-03
    • 2021-07-21
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多