首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >长距离熊猫datetime64

长距离熊猫datetime64
EN

Stack Overflow用户
提问于 2018-03-20 05:57:47
回答 1查看 779关注 0票数 0

我有一个日期时间值从第一年到未来的DataFrame。当我试图将数据导入到熊猫中时,dtype被设置为object,尽管我希望datetime64使用.dt访问器。

考虑一下这段代码:

代码语言:javascript
复制
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]?我不关心纳米/毫秒的精确性,但我想要范围。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-20 06:36:49

熊猫通常可以转换成datetime.datetime物体:

代码语言:javascript
复制
df.dates = pd.to_datetime(df.dates)

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

首先,虽然Pandas可以转换为datetime.datetime,但它不能处理具有tz感知的datetime,而且您已经为您的datetime注入了一个时区。幸运的是,这个方法很容易修复--您正在显式地使用UTC,并且您可以在不知道对象的情况下这样做。

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

代码语言:javascript
复制
>>> (1<<64) / / 1000000000 / 3600 / 24 / 365.2425
584.5540492538555

潘达斯的文档清楚地表明了这一点。

由于熊猫代表的是纳秒分辨率的时间戳,因此可以用64位整数表示的时间跨度限制在大约584年:

代码语言:javascript
复制
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对象的引用。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49377215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档