如何解决超出范围的纳秒

时间:2019-01-15 16:23:41

标签: python pandas

 LastLogin                         LastPurchased              
2018-08-21 00:28:04.081677         0001-01-01 00:00:00
2018-08-21 00:28:58.209522         2018-08-20 00:28:58.209522    

我需要(df[LastLogin] - df['LastPurchased']).dt.days天的差额,但是'0001-01-01 00:00:00'中有些LastPurchased。我尝试将1-01-01更改为熊猫范围内的日期会导致Out of bounds nanosecond timestamp: 1-01-01 00:00:00。还有其他方法吗?

     LastLogin                         LastPurchased              Days
2018-08-21 00:28:04.081677         1999-01-01 00:00:00            6935
2018-08-21 00:28:58.209522         2018-08-20 00:28:58.209522      1

1 个答案:

答案 0 :(得分:2)

熊猫要求您的日期时间中的年份必须大于1677且小于2622(大约-确切范围请参见pandas/_libs/tslibs/src/datetime/np_datetime.c)。否则,给定日期超出了纳秒级分辨率的64位整数可以表示的范围:

>>> pd.Timestamp.max
Timestamp('2262-04-11 23:47:16.854775807')
>>> pd.Timestamp.min
Timestamp('1677-09-21 00:12:43.145225')
>>> pd.Timestamp.max - pd.Timestamp.min
datetime.timedelta(213503, 84873, 709550)

如何处理此问题取决于您。通过减去日期0001-01-01,考虑您最终要尝试表示的内容。我认为这意味着用户已经登录但从未购买过。

要强制LastPurchased使用有效的熊猫时间戳或pd.NaT(“不是时间”),可以使用

df['LastPurchased'] = pd.to_datetime(df['LastPurchased'], errors='coerce')

这将使NaT成为这些点的区别:

>>> pd.Timestamp(2018, 1, 1) - pd.NaT
NaT

您可以将其用作“前哨”并使用pd.isnat()进行检查。