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