Python 如何计算两只熊猫之间的差异。以纳秒为单位的时间戳序列

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:

我有两个系列是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: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