首页 > 解决方案 > 如何解决越界纳秒

问题描述

 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为 Panda 范围内的日期的任何操作都会导致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

标签: pythonpandas

解决方案


Pandas 要求您的日期时间中的年份大于 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转换为有效的 Pandas 时间戳或pd.NaT(“不是时间”),您可以使用

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

这将给出NaT这些点的差异:

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

您可以将其用作“哨兵”并使用pd.isnat().


推荐阅读