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




