【问题标题】:How to handle dates which is out of timestamp range in pandas?如何处理熊猫中超出时间戳范围的日期?
【发布时间】:2021-06-26 16:59:30
【问题描述】:

我正在使用 Crunchbase 数据集。我有一个成立于 1636 年的哈佛大学的条目。当我尝试将字符串转换为 DateTime 时,这个条目给了我一个错误。

OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1636-09-08 00:00:00

我发现 pandas 支持 1677 年的时间戳

>>> pd.Timestamp.min
Timestamp('1677-09-21 00:12:43.145225')

我查看了一些解决方案,例如建议使用 errors='coerce' 但删除此条目/使其为空不是一种选择。 您能否提出解决此问题的方法?

【问题讨论】:

  • 来自文档Timestamp limitations“由于 pandas 以纳秒分辨率表示时间戳,因此可以使用 64 位整数表示的时间跨度被限制为大约 584 年”
  • 您要如何处理需要时间戳数据类型的数据? Representing out-of-bounds spans中有一些不错的选择
  • 这很有帮助。

标签: python pandas timestamp


【解决方案1】:

正如Henry 在 cmets 中提到的,pandas 时间戳存在限制,因为它在 float64 中表示,您可以在需要时使用 datetime 库解析日期时间来解决它,否则让它保持为字符串或将其转换为整数

场景 1:如果您打算仅在打印时显示此值

datetime_object = datetime.strptime('1636-09-08 00:00:00', '%Y-%m-%d %H:%M:%S')

场景 2:如果您想将其用作日期列以在数据框中保留信息,您还可以

datetime_object.strftime("%Y%m%d%H%M%S")

在 pandas 数据框中的列上使用它会产生这个

df=pd.DataFrame([['1636-09-08 00:00:00'],['1635-09-09 00:00:00']], columns=['dates'])
df['str_date']=df['dates'].apply(lambda x:datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
df.head()
dates str_date
0 1636-09-08 00:00:00 1636-09-08 00:00:00
1 1635-09-09 00:00:00 1635-09-09 00:00:00

pandas 将此列视为对象列,但当你访问它时,它是一个日期时间列

df['str_date'][0]
>>datetime.datetime(1636, 9, 8, 0, 0)

另外,为了完整起见添加:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-oob

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多