Pandas datetime64,范围更长

时间:2018-03-20 05:57:47

标签: python pandas datetime

我有一个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]?我并不关心纳米/毫秒精度,但我想要的是范围。

1 个答案:

答案 0 :(得分:1)

Pandas通常可以转换为datetime.datetime个对象:

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

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

首先,虽然Pandas可以转换为datetime.datetime和从datetime转换,但它无法处理tz感知>>> (1<<64) / / 1000000000 / 3600 / 24 / 365.2425 584.5540492538555 ,并且您已经为您的时区灌输了时区。幸运的是,这个很容易修复 - 你明确使用UTC,你可以在不知道对象的情况下做到这一点。

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

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')

the Pandas documentation makes this clear

  

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

Period

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

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