大熊猫改变不均匀的时间序列数据

时间:2014-04-24 00:31:59

标签: pandas shift

我有一些不规则标记的时间序列数据,包括时间戳和大熊猫每个时间戳的观察结果。不规则基本上意味着时间戳不均匀,例如两个连续时间戳之间的差距不均匀。

例如,数据可能看起来像

    Timestamp     Property
    0                100
    1                200
    4                300
    6                400
    6                401
    7                500
    14               506
    24               550
           .....
    59               700
    61               750
    64               800

此处的时间戳是指自选择的原始时间起经过的秒数。正如您所看到的,我们可以在同一时间戳上获得数据,在这种情况下为6秒。基本上时间戳严格不同,只是第二个分辨率无法衡量变化。

现在我需要提前移动时间序列数据,比如我想将整个数据移动60秒或一分钟。所以目标输出是

  Timestamp     Property
    0                750
    1                800

因此0点与61点匹配,1点与64点匹配。

现在我可以通过写脏东西来做到这一点,但我希望尽可能多地使用任何内置的pandas功能。如果时间序列是规则的,或者均匀间隙,我可以使用shift()函数。但这个系列不均匀的事实让它有点棘手。欢迎来自熊猫专家的任何想法。我觉得这将是一个常见的问题。非常感谢!

1 个答案:

答案 0 :(得分:1)

编辑:添加了第二种更优雅的方式。我不知道如果你的时间戳为1,两个时间戳为61,会发生什么。我认为它会选择前61个时间戳,但不确定。

new_stamps = pd.Series(range(df['Timestamp'].max()+1))
shifted = pd.DataFrame(new_stamps)
shifted.columns = ['Timestamp']

merged = pd.merge(df,shifted,on='Timestamp',how='outer')
merged['Timestamp'] = merged['Timestamp'] - 60
merged = merged.sort(columns = 'Timestamp').bfill()

results = pd.merge(df,merged, on = 'Timestamp')

[原帖] 我想不出一个内置或优雅的方式来做到这一点。发布这个以防它比你的“脏东西”更优雅,这是我不太可能的。怎么样:

lookup_dict = {}

def assigner(row):
    lookup_dict[row['Timestamp']] = row['Property']

df.apply(assigner, axis=1)
sorted_keys = sorted(lookup_dict.keys)
df['Property_Shifted'] = None

def get_shifted_property(row,shift_amt):
    for i in sorted_keys:
        if i >= row['Timestamp'] + shift_amt:
            row['Property_Shifted'] = lookup_dict[i]
    return row

df = df.apply(get_shifted_property, shift_amt=60, axis=1)