pandas.DataFrame初始化时如何直接将日期列设为datetime类型
Pandas 初始化时直接生成datetime类型列的可行方案
之前写法运行失败的核心原因有两点:
- 旧版的
pd.datetime接口在pandas新版本中早已被弃用,不属于合法的dtype传参格式 - DataFrame构造器的原生
dtype参数仅支持基础数值、字符串等类型的批量转换,本身不具备自动把非标准化格式的日期字符串解析为datetime对象的能力
可落地的实现方式
- 全版本兼容、最稳妥的实现:在构造DataFrame前就把日期列数据用
pd.to_datetime完成解析,再传入构造器。示例代码:
import pandas as pd # 预先解析日期,显式指定格式避免歧义 date_data = pd.to_datetime(['2020-01-01', '2020-07-01'], format='%Y-%m-%d') # 构造时直接传入解析好的日期数据,无需事后转列 df = pd.DataFrame({'date': date_data})
这种方法初始化完成后,df['date']的dtype会直接是期望的datetime64[ns],完全省去事后逐列转换的步骤,还可以灵活指定日期解析格式,避免格式不统一导致的解析错误。
- pandas 2.0+版本支持字典形式的dtype传参,可给指定列直接指定datetime类型,适配逐行传入列表数据的构造场景:
df = pd.DataFrame( [['2020-01-01'], ['2020-07-01']], columns=['date'], # 注意必须传字符串形式的dtype标识,不能传已弃用的pd.datetime dtype={'date': 'datetime64[ns]'} )
注意:这种写法仅对符合ISO 8601标准格式的日期字符串生效,如果你的日期是'01/07/2020'这类非标准格式,会触发解析错误,兼容性不如第一种预先解析的方法,且仅在pandas 2.0及以上版本支持,1.x版本传字典形式的dtype会触发参数错误。
经验提示:不要盲目依赖构造器的自动日期解析能力,只要你的日期数据存在非标准格式、顺序歧义(比如月日和日月顺序混淆)的情况,优先用
pd.to_datetime显式指定format参数传入数据,是最不容易出bug的方案。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

