You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Pandas跨超长时间范围datetime64类型转换问题求助

解决Pandas中超范围datetime转为datetime64类型的问题

嘿,我来帮你搞定这个datetime类型转换的问题!你碰到的情况其实很常见:当你的日期范围超出了Pandas默认datetime64[ns]的覆盖区间时,数据就会被当成object类型存储,自然没法用.dt访问器了。

为什么会出现这个问题?

Pandas默认的datetime64[ns](纳秒精度)能覆盖的时间范围大概是公元1677年到2262年,你的例子里既有公元108年的早期日期,又有2529年的远期日期,都超出了这个范围,所以导入后dtype变成了object

解决方法:指定更宽范围的datetime精度

我们可以通过指定更低的时间精度(比如毫秒、秒)来扩展datetime的覆盖范围,这些精度对应的时间区间足够覆盖公元1年到9999年:

  • datetime64[ms]:覆盖公元1年1月1日到9999年12月31日(保留毫秒精度)
  • datetime64[s]:覆盖公元1年1月1日到9999年12月31日(保留秒精度)

具体代码实现

先看你的原始代码:

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)
    ]
})

# 查看原始dtype,会输出object
print(df['dates'].dtype)

接下来执行转换,这里以datetime64[ms]为例:

# 转换为datetime64[ms]类型,保留时区信息
df['dates'] = pd.to_datetime(df['dates'], dtype='datetime64[ms]')

# 查看转换后的dtype,会输出datetime64[ms, UTC]
print(df['dates'].dtype)

如果不需要毫秒级精度,也可以用秒精度:

df['dates'] = pd.to_datetime(df['dates'], dtype='datetime64[s]')

验证.dt访问器可用

转换完成后,你就可以正常使用.dt访问器提取日期属性了:

# 提取年份、月份、小时等信息
df['year'] = df['dates'].dt.year
df['month'] = df['dates'].dt.month
df['hour'] = df['dates'].dt.hour

print(df)

输出结果会包含你需要的日期拆分字段,完全符合预期~

内容的提问来源于stack exchange,提问作者Heikki

火山引擎 最新活动