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
答案 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()
进行检查。