我有一个包含时间戳列的数据框。我的目标是找到每行的第一个时间戳,该时间戳大于该行的时间戳给定的偏移量(例如 0.01 秒)。我尝试使用这里给出的答案 https://stackoverflow.com/questions/32237862/find-the-closest-date-to-a-given-date,以修改后的方式,例如:
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 https://drive.google.com/file/d/104ngrhwXqgQa1fjMWYMiH5g2Vt8SzO9G/view?usp=sharing.
预期输出是数据帧中添加的列,其中包含后续时间戳中的第一个时间戳,该时间戳比当前行的时间戳至少大 0.01 秒。例如:- 对于给定的数据集,第一行的新列(有时间09:15:00.022995
)应该有价值09:15:00.033136
。对于后续的每一行都相同。
一点指导会有很大帮助。
我认为最快和最简单的方法是使用searchsorted https://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html。如果没有元素大于df.exchTstamp+delta
, then 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')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)