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
Run Code Online (Sandbox Code Playgroud)
我需要几天的差异,(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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这取决于您想如何处理。考虑您最终要通过减去日期 0001-01-01来表示什么。我假设这意味着用户已登录但从未购买过。
要强制LastPurchased使用有效的 Pandas 时间戳或pd.NaT(“不是时间”),您可以使用
df['LastPurchased'] = pd.to_datetime(df['LastPurchased'], errors='coerce')
Run Code Online (Sandbox Code Playgroud)
这将给出NaT这些点的差异:
>>> pd.Timestamp(2018, 1, 1) - pd.NaT
NaT
Run Code Online (Sandbox Code Playgroud)
您可以将其用作“哨兵”并使用pd.isnat().