我有一个大数据框,包含大约7000000行的时间序列数据,看起来像这样
timestamp | values
2019-08-01 14:53:01 | 20.0
2019-08-01 14:53:55 | 29.0
2019-08-01 14:53:58 | 22.4
...
2019-08-02 14:53:25 | 27.9
我想为每行创建一个延迟版本为1天的列,因为我的时间戳不完全匹配,所以我不能使用普通的shift()
方法。
结果会是这样的:
timestamp | values | lag
2019-08-01 14:53:01 | 20.0 | Nan
2019-08-01 14:53:55 | 29.0 | Nan
2019-08-01 14:53:58 | 22.4 | Nan
...
2019-08-02 14:53:25 | 27.9 | 20.0
我找到了一些与获取最接近给定时间的时间戳相关的帖子:Find closest row of DataFrame to given time in Pandas并尝试了这些方法,它可以完成任务,但运行时间太长,以下是我得到的:
def get_nearest(data, timestamp):
index = data.index.get_loc(timestamp,"nearest")
return data.iloc[index, 0]
df['lag'] = [get_nearest(df, dt) for dt in df.index]
有什么有效的方法来解决这个问题吗
假设您的日期已排序,快速执行此操作的一种方法是使用^{} 在
O[N log N]
时间内查找所有匹配的日期创建一些测试数据时,可能会出现如下情况:
使用这种方法,可以在数十毫秒内计算出具有100万行的数据帧:
然而,请注意,这并没有找到最接近一天的值,而是在一天的滞后之后找到最接近的。如果希望在两个方向上获得最接近的值,则需要修改此方法
嗯,不确定这是否会更有效,但是merge_asof是一种值得研究的方法,因为它不需要udf
该方法实质上是将前一天的值合并到第二天,然后匹配到最近的时间戳
相关问题 更多 >
编程相关推荐