Skip to main content
 首页 » 编程设计

python之按给定时间增量在数据框列中查找时间戳

2025年05月04日16cmt

我有一个包含时间戳列的数据框。我的目标是为每一行找到第一个时间戳,该时间戳比行的时间戳大一个给定的偏移量(比如 0.01 秒)。我尝试使用 the answer given here ,以一种修改的方式,如:

def getTime(col, base, offset=0.01): 
    later = filter(lambda d: d > base+dt.timedelta(seconds=offset), col) 
    return min(later) 
 
testTbt['testTime']=testTbt['exchTstamp'].apply(lambda time: getTime(testTbt[testTbt['exchTstamp']>time]['exchTstamp'].iloc[0:100].tolist(), time, 0.01)) 

但出现错误:ValueError: min() arg is an empty sequence。

时间戳为微秒级别,包含重复值且按升序排列。

这是数据框的初始行:

    exchTstamp                  seqNum prev10mSecAvg prev1SecAvg    imbRegime 
0   2019-08-14  09:15:00.022991 199    0.000000      0.000000       0 
1   2019-08-14  09:15:00.022995 200   -0.166667     -0.166667       3 
2   2019-08-14  09:15:00.022999 201   -0.277778     -0.277778       2 
3   2019-08-14  09:15:00.023003 202   -0.333333     -0.333333       2 
4   2019-08-14  09:15:00.023007 203   -0.386667     -0.386667       2 

可以下载数据的 csv here .

预期输出是数据框中添加的列,包含后续时间戳中的第一个时间戳,该时间戳至少比当前行的时间戳大 0.01 秒。例如:- 对于给定的数据集,第一行的新列(具有时间 09:15:00.022995)的值应为 09:15:00.033136。每个后续行都相同。

一点指导会有很大帮助。

请您参考如下方法:

我认为最快和最简单的方法是使用 searchsorted .如果没有大于 df.exchTstamp+delta 的元素,则 searchsorted 将返回数组的长度,即超出数据帧索引范围的索引。因此,我们首先需要为这种情况插入一个 nan/NaT 标记行,然后我们将其删除:

import numpy as np, pandas as pd, datetime as dt 
 
df = pd.read_csv('stack.csv', index_col=0, parse_dates=[1]) 
delta = dt.timedelta(seconds=0.01) 
 
res = np.searchsorted(df.exchTstamp, df.exchTstamp+delta) 
 
# add sentinel 
df.append(pd.Series(), ignore_index=True) 
 
df["testTime"] = df.loc[res,'exchTstamp'].values 
 
# remove sentinel 
df = df.drop(df.index[-1]) 
 
df.to_csv('stack-out.csv')