Python 如何计算两只熊猫之间的差异。以纳秒为单位的时间戳序列
我有两个系列是pd时间戳,它们非常接近。我想得到两个系列之间的元素差异,但精度为纳秒 第一系列:Python 如何计算两只熊猫之间的差异。以纳秒为单位的时间戳序列,python,pandas,datetime,timedelta,Python,Pandas,Datetime,Timedelta,我有两个系列是pd时间戳,它们非常接近。我想得到两个系列之间的元素差异,但精度为纳秒 第一系列: 0 2021-05-21 00:02:11.349001429 1 2021-05-21 00:02:38.195857153 2 2021-05-21 00:03:25.527530228 3 2021-05-21 00:03:26.653410069 4 2021-05-21 00:03:26.798157366 第二系列: 0 2021-05-21 00:
0 2021-05-21 00:02:11.349001429
1 2021-05-21 00:02:38.195857153
2 2021-05-21 00:03:25.527530228
3 2021-05-21 00:03:26.653410069
4 2021-05-21 00:03:26.798157366
第二系列:
0 2021-05-21 00:02:11.348997322
1 2021-05-21 00:02:38.195852267
2 2021-05-21 00:03:25.527526087
3 2021-05-21 00:03:26.653406759
4 2021-05-21 00:03:26.798154350
现在,如果我只使用-
操作符,我将截断纳秒差。它将显示如下内容:
Series1 - Series2
0 00:00:00.000004
1 00:00:00.000004
2 00:00:00.000004
3 00:00:00.000003
4 00:00:00.000003
我不想在计算时间戳之间的差异时失去纳秒级的精度。我已经找到了一个解决方案,包括在每行上做一个for循环,计算pd.Timedelta中的标量差,然后从中得到微秒和纳秒。这样(对于第一个元素):
是否有一种更简洁的矢量化方法来实现这一点,而不是使用for循环?如果使用如图所示的timedelta,您不会失去精度。内部表示始终为纳秒。计算时间增量后,可以将其转换为整数以纳秒为单位获得差值。例:
import pandas as pd
import numpy as np
s1 = pd.Series(pd.to_datetime(["2021-05-21 00:02:11.349001429",
"2021-05-21 00:02:38.195857153",
"2021-05-21 00:03:25.527530228",
"2021-05-21 00:03:26.653410069",
"2021-05-21 00:03:26.798157366"]))
s2 = pd.Series(pd.to_datetime(["2021-05-21 00:02:11.348997322",
"2021-05-21 00:02:38.195852267",
"2021-05-21 00:03:25.527526087",
"2021-05-21 00:03:26.653406759",
"2021-05-21 00:03:26.798154350"]))
delta = (s1-s2).astype(np.int64)
delta
0 4107
1 4886
2 4141
3 3310
4 3016
dtype: int64
注意:我在这里使用numpy的int64类型,因为在某些系统上,内置的
int
将导致32位整数,即转换失败。在执行减法之前,可以将日期时间序列转换为整数(.astype(int)
);这将直接给你纳秒的时间。太好了,这很有效!基于其他一些答案,我尝试转换为numpy uint64,但这也缩短了纳秒。但是astype(int)
没有这样的问题。非常感谢。如果你加上它作为回答,我会接受它。我必须修改我的评论;实际上没有必要事先进行转换,请参见下面的答案。
import pandas as pd
import numpy as np
s1 = pd.Series(pd.to_datetime(["2021-05-21 00:02:11.349001429",
"2021-05-21 00:02:38.195857153",
"2021-05-21 00:03:25.527530228",
"2021-05-21 00:03:26.653410069",
"2021-05-21 00:03:26.798157366"]))
s2 = pd.Series(pd.to_datetime(["2021-05-21 00:02:11.348997322",
"2021-05-21 00:02:38.195852267",
"2021-05-21 00:03:25.527526087",
"2021-05-21 00:03:26.653406759",
"2021-05-21 00:03:26.798154350"]))
delta = (s1-s2).astype(np.int64)
delta
0 4107
1 4886
2 4141
3 3310
4 3016
dtype: int64