我有一个日期时间值从第一年到未来的DataFrame。当我试图将数据导入到熊猫中时,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]?我不关心纳米/毫秒的精确性,但我想要范围。
发布于 2018-03-20 06:36:49
熊猫通常可以转换成datetime.datetime物体:
df.dates = pd.to_datetime(df.dates)但在你的情况下,你不能这样做,有两个原因。
首先,虽然Pandas可以转换为datetime.datetime,但它不能处理具有tz感知的datetime,而且您已经为您的datetime注入了一个时区。幸运的是,这个方法很容易修复--您正在显式地使用UTC,并且您可以在不知道对象的情况下这样做。
其次,64位纳秒无法处理您想要的日期范围:
>>> (1<<64) / / 1000000000 / 3600 / 24 / 365.2425
584.5540492538555和潘达斯的文档清楚地表明了这一点。
由于熊猫代表的是纳秒分辨率的时间戳,因此可以用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时代,这是有道理的。)
但是请注意,文档链接到代表越界范围:您可以使用Periods,这将比int64s更低效率和方便,但可能比object更方便。(我认为内部存储最终是YYYYMMDD风格的字符串,但它们作为固定长度的字符串直接存储在数组中,而不是作为对堆上的int64s对象的引用。)
https://stackoverflow.com/questions/49377215
复制相似问题