具有更长范围的 Pandas datetime64

Posted

技术标签:

【中文标题】具有更长范围的 Pandas datetime64【英文标题】:Pandas datetime64 with longer range 【发布时间】:2018-08-28 20:30:04 【问题描述】:

我有一个 DataFrame,其日期时间值从第 1 年到未来。当我尝试将数据导入 pandas 时,dtype 设置为 object 尽管我希望它是 datetime64 以使用 .dt 访问器。

考虑这段代码:

import pytz
from datetime import datetime
import pandas as pd

df = pd.DataFrame('dates': [datetime(108, 7, 30, 9, 25, 27, tzinfo=pytz.utc),
                             datetime(2018, 3, 20, 9, 25, 27, tzinfo=pytz.utc),
                             datetime(2529, 7, 30, 9, 25, 27, tzinfo=pytz.utc)])
In [5]: df.dates
Out[5]: 
0    0108-07-30 09:25:27+00:00
1    2018-03-20 09:25:27+00:00
2    2529-07-30 09:25:27+00:00
Name: dates, dtype: object

如何将其转换为 dtype datetime64[s]?我并不关心纳秒/毫秒的精度,但我想要这个范围。

【问题讨论】:

df['dates']=pd.to_datetime(df['dates'], format=' ') 除非他们在我上次处理这个问题后添加了它,否则 Pandas 与 datetime.datetime 的内置转换不适用于 tz 感知日期时间对象,所以你不能这样做.但是由于您的对象是 UTC,这应该不是问题——只需创建 UTC 日期时间而不是具有 UTC 时区的 tz 感知日期时间对象。 但是无论如何,这仍然行不通,因为 64 位纳秒无法跨越您想要的范围;他们只能处理584年多一点。我不记得 Pandas 的界限在哪里,但我可以查一下。 【参考方案1】:

Pandas 通常可以与datetime.datetime 对象相互转换:

df.dates = pd.to_datetime(df.dates)

但在你的情况下,你不能这样做,原因有两个。

首先,虽然 Pandas 可以在 datetime.datetime 之间进行转换,但它无法处理 tz 感知 datetimes,而且你已经为你的时区注入了时区。幸运的是,这个问题很容易修复——您明确地使用了 UTC,而且您可以在没有感知对象的情况下做到这一点。

其次,64 位纳秒无法处理您想要的日期范围:

>>> (1<<64) / / 1000000000 / 3600 / 24 / 365.2425
584.5540492538555

还有the Pandas documentation makes this clear:

由于 pandas 以纳秒分辨率表示时间戳,因此可以使用 64 位整数表示的时间跨度被限制为大约 584 年:

In [66]: pd.Timestamp.min
Out[66]: Timestamp('1677-09-21 00:12:43.145225')

In [67]: pd.Timestamp.max
Out[67]: Timestamp('2262-04-11 23:47:16.854775807')

(看起来他们把 0 点放在了 Unix 纪元,这是有道理的。)

但请注意,文档链接到Representing Out-of-Bounds Spans:您可以使用Periods,它不如int64s 高效和方便,但可能比objects 更方便。 (我相信内部存储最终是 YYYYMMDD 样式的字符串,但它们直接作为固定长度的字符串存储在数组中,而不是作为对堆上 Python 对象的引用。)

【讨论】:

以上是关于具有更长范围的 Pandas datetime64的主要内容,如果未能解决你的问题,请参考以下文章

Python/Pandas:如何从 datetime64[ns] 转换为 datetime

如何从 pandas.DatetimeIndex 转换为 numpy.datetime64?

pandas 中 datetime 和 datetime64[ns] 的比较

将 datetime64[ns, UTC] pandas 列转换为 datetime

将 pandas 列转换为 datetime64,包括缺失值

使用 pandas.join 在 datetime64[ns, UTC] 上加入失败