创建新列时Pandas datetime64[D]日期转换失效问题
核心原因:Pandas的datetime列默认是纳秒精度
你遇到的问题其实是Pandas的设计特性导致的:Pandas的datetime类型列(也就是datetime64[ns])是固定使用纳秒精度的。当你把numpy的datetime64[D]数组赋值给DataFrame列时,Pandas会自动把它转换回datetime64[ns]类型——它不会保留numpy的日精度datetime作为列的 dtype。
举个直观的例子:你单独运行df2['date'].values.astype('datetime64[D]')得到的确实是datetime64[D]的numpy数组,但一旦把这个数组放到Pandas的列里,Pandas就会“自动修正”类型,回到它默认的纳秒精度。这是因为Pandas的DatetimeArray(支撑datetime列的底层结构)是专门为纳秒粒度设计的,目的是统一处理各种时间场景,避免类型混乱。
满足需求的正确做法
如果你想要的是只保留日期、去掉时间部分的效果,不需要强行追求datetime64[D]类型(因为Pandas不支持把它作为列类型),推荐用以下两种方式实现:
截断时间到日期精度
使用dt.floor('D')或者dt.normalize()方法,把时间部分截断到当天的00:00:00,结果还是datetime64[ns]类型,但实际效果和你想要的datetime64[D]完全一致:# 两种方法二选一 df2['date'] = df2['date'].dt.floor('D') df2['date'] = df2['date'].dt.normalize()若仅需numpy层面的日精度数组
如果你只是需要在numpy操作中使用datetime64[D]数组,可以单独保存它,但不要赋值给Pandas列:date_d_array = df2['date'].values.astype('datetime64[D]') # 这个数组是datetime64[D]类型,但无法直接作为Pandas列存在
另外,你尝试的df2.assign(date=newcol)方法没生效,是因为assign默认返回新的DataFrame,不会修改原DataFrame,除非你把结果重新赋值给原变量:
df2 = df2.assign(date=newcol)
但即使这么做,最终列的类型还是会被Pandas转成datetime64[ns],原因和之前一样。
验证效果
执行截断操作后,查看列内容:
print(df2['date'])
输出会是:
0 2015-10-05 1 2015-10-05 2 2015-10-06 3 2015-10-06 4 2015-10-06 5 2015-12-18 Name: date, dtype: datetime64[ns]
虽然dtype显示还是datetime64[ns],但时间部分已经被完全移除,完全满足你需要的日期精度需求。
内容的提问来源于stack exchange,提问作者singularity2047

