如何计算两只Pandas之间的差异,时间戳系列以纳秒为单位

ntjbwcob  于 2022-11-20  发布在  其他
关注(0)|答案(2)|浏览(152)

我有两个系列,它们是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中的标量差异,然后从中得到微秒和纳秒。如下所示(对于第一个元素):

single_diff = Series1[0] - Series2[0]
single_diff.microseconds * 1000 + single_diff.nanoseconds
4107

有没有一种更简洁的矢量化方法来代替for循环?

rdrgkggo

rdrgkggo1#

如果你使用下面的timedelta,你不会丢失精度。内部表示总是纳秒。在计算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位整数,即转换失败。

az31mfrm

az31mfrm2#

您也可以在没有numpy的情况下获得纳秒,如下所示

import pandas as pd

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",
        ]
    )
)

(s1 - s2 ).apply(lambda x: x.delta)
# 0    4107
# 1    4886
# 2    4141
# 3    3310
# 4    3016
# dtype: int64

相关问题