python - 如何解决越界纳秒
问题描述
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
解决方案
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()
.
推荐阅读
- angular - 如何创建具有角度动态垫步的动态形式?
- javascript - React Native 项目中的代码算法
- powerbi - 在 PBI 服务中刷新数据流实际上有什么作用?
- amazon-web-services - 如何在 spacy 运行时下载“en_core_web_sm”模型?
- python - 'from src.module import Class' 与 'from module import class' 导致 __name__ 的值不同
- mariadb - 每次在 MariaDB 上正确索引表
- excel - 如何使用 VBA 将 2 位数字舍入
- python - pandas 数据框的集成会产生一个长度不同的数组。如何将其存储在同一个数据框中?
- angular - Ngx 颜色选择器问题与反应形式的数据值
- flutter - Flutter 关于 Dismissible 类