具有更长范围的 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 感知 datetime
s,而且你已经为你的时区注入了时区。幸运的是,这个问题很容易修复——您明确地使用了 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:您可以使用Period
s,它不如int64s 高效和方便,但可能比object
s 更方便。 (我相信内部存储最终是 YYYYMMDD 样式的字符串,但它们直接作为固定长度的字符串存储在数组中,而不是作为对堆上 Python 对象的引用。)
【讨论】:
以上是关于具有更长范围的 Pandas datetime64的主要内容,如果未能解决你的问题,请参考以下文章
Python/Pandas:如何从 datetime64[ns] 转换为 datetime
如何从 pandas.DatetimeIndex 转换为 numpy.datetime64?
pandas 中 datetime 和 datetime64[ns] 的比较
将 datetime64[ns, UTC] pandas 列转换为 datetime