【问题标题】:Interpolate single value from time series从时间序列中插入单个值
【发布时间】:2016-03-04 20:27:01
【问题描述】:

我有一组相对较大 (~300 MB) 的地理位置数据,格式为

Timestamp, id, type, x, y

具有以下数据类型:

In[7]: df.dtypes
Out[7]: 
Timestamp    datetime64[ns]
id                    int64
type                 object
X                     int64
Y                     int64
dtype: object

每个id对应一个特定的用户,每个人全天记录了几百个点。

我想创建一个情节,显示每个人在某一秒的位置。所以我需要为每个 id 加 1 分。但是,数据有些稀疏,不太可能有与那一秒精确相关的数据点。我想通过在最近的两点之间插值来近似。

在数据点之间,我假设人们是线性移动的,所以如果我们知道 8:31:10 和 8:31:50 的位置,那么在 8:31:30 他们应该正好在这两者之间位置,并且在 8:31:11,它们应该是点之间距离的 1/40(因此按此处所述进行插值:Pandas data frame: resample with linear interpolation

我认为基本流程是:

  • 遍历每个 id:
    • 获取该 id 的过滤器数据
    • 获取时间之前的最后位置(例如,8:31:11 之前的最后记录位置,或使用的任何时间)
    • 在某个时间之后获取第一个位置(例如,在 8:31:11 之后的第一个记录位置,或使用的任何时间)
    • 插值以确定它们在那一秒的位置
    • 将位置添加到列表中
  • 每个 id 位置的绘图列表

我知道我可以遍历每个 id

for name, group in df.groupby('id'):

并且绘图不是问题,但我不确定其余的。

经过一番搜索,我没有找到任何好的方法来为每个组中的单个值执行此操作。其他答案建议使用 resample 和 interpolate 函数,但是对于我拥有的数据大小而言,这将花费太长时间,并且会进行很多不必要的计算,因为我只需要一个点。

【问题讨论】:

    标签: python numpy pandas matplotlib gis


    【解决方案1】:

    不是很清楚你想要什么,但让我们开始吧

    首先,您可能需要唯一 ID 列表,对吧?

    import pandas as pd
    import numpy as np
    
    df = ...
    
    unids = np.unique(df[['id']])
    
    for id in unids:
        df_id = # subset df by id, filtering out rows by id, and get back dataframe
        # sort new df by Timestamp
        tmin = new_df['Timestamp'][0]
        tmax = new_df['Timestamp'][-1]
        tstep = ... # time step
    
        position = []
        for t in range(tmin, tmax, tstep):
            # interpolate
            # add to position
        plot(position)
    

    这看起来合理吗?

    【讨论】:

    • 我在问题中添加了更多内容,希望能更好地解释它。基本上,我希望每个人在某个时间(例如上午 10:30:14)得到 1 分,但不太可能有任何与该时间完全对应的数据。所以我想我需要在 10:30:14 之前和 10:30:14 之后获取数据并进行插值。但每个人的数据跨越一整天。
    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 2017-08-13
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多