将DatetimeIndex转换为Timedelta索引

5

假设:

ts = pd.to_datetime(['2014-01-08 08:00:42',
                     '2014-01-08 08:01:00',
                     '2014-01-08 08:01:12'])

有没有一种规定的方法可以得到每个元素之间的时间差(最好使用total_seconds属性)的结果?

我现在的方法似乎过于冗长:

pd.Index((pd.Series(ts) - pd.Series(ts).shift())).total_seconds()
# Float64Index([nan, 18.0, 12.0], dtype='float64')

我并不关心最终的数据结构类型,无论它是列表、索引还是序列。


1
ts.to_series().diff().dt.total_seconds().values? - Zero
@Zero为什么不提交答案? - Scott Boston
1个回答

1
您可以这样使用np.diff
np.diff(ts.values).astype(int) / 1E9

array([ 18.,  12.])

或者

np.append(np.nan, np.diff(ts.values).astype(int) / 1E9)

array([ nan,  18.,  12.])

我在前面添加了一个 np.nan 但增加了冗长性。 - piRSquared
你需要 np.append(np.nan, (np.diff(ts.values) // 1E9).astype(int)) 是吗? - Zero
既然我们在这里,也许可以这样做:[np.nan] + (np.diff(ts.values) // 1E9).tolist() - Zero
我认为你的第一个建议和我提出的没有区别。我使用 astype(int) 强制转换为整数,以避免 timedelta[ns] 计时单位。之后,我觉得进行强制转换的顺序不会影响最终结果。对于你的第二个建议,如果没有经过测试,我不能确定...但我愿意打赌这会有性能损失。 - piRSquared
1
啊,np.diff(ts.values).astype(int) // 1E9 给了我 array([ 0., -1.]),因此要求移动 astype - Zero
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接