You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中Datetime转Date:全NaT列类型统一转换方法问询

统一转换Datetime列为Date类型(含全NaT列)

有两种可靠的方式可以实现所有datetime列(包括全NaT的列)统一转换为日期类型,适配不同的需求场景:

方式1:转换为Python原生datetime.date对象(Object类型列)

这种方式会将所有列的元素转为datetime.date对象,全NaT列会转为包含None的Object类型列,确保类型统一:

import pandas as pd

df = pd.DataFrame({
    "dt1":["2020-02-04","2021-05-02"],
    "dt2":[pd.NaT,pd.NaT],
    "dt3":[pd.NaT,"2020-03-26"]
})

# 先将所有列转为datetime类型
df = df.apply(pd.to_datetime)

# 统一转换为date对象
for col in df.columns:
    df[col] = df[col].dt.date

# 验证结果
print(df.dtypes)
# 输出:
# dt1    object
# dt2    object
# dt3    object
# dtype: object

print(type(df["dt1"][0]))  # <class 'datetime.date'>
print(df["dt2"][0])       # None

方式2:转换为Pandas原生日期类型(datetime64[ns])

如果更关注存储效率和Parquet兼容性,推荐这种方式——仅保留datetime的日期部分,列类型统一为datetime64[ns],全NaT列也会保持该类型:

import pandas as pd

df = pd.DataFrame({
    "dt1":["2020-02-04","2021-05-02"],
    "dt2":[pd.NaT,pd.NaT],
    "dt3":[pd.NaT,"2020-03-26"]
})

# 先将所有列转为datetime类型
df = df.apply(pd.to_datetime)

# 统一保留日期部分(截断时间为00:00:00)
df = df.apply(lambda x: x.dt.floor('D'))

# 验证结果
print(df.dtypes)
# 输出:
# dt1    datetime64[ns]
# dt2    datetime64[ns]
# dt3    datetime64[ns]
# dtype: object

print(df["dt1"][0])  # 2020-02-04 00:00:00(实际仅存储日期信息,Parquet会正确识别为日期类型)

为什么之前的方法有问题?

当列全为NaT时,直接使用df.column.dt.date在部分Pandas版本中可能因元素全为缺失值,导致类型未自动转为Object。上述两种方式通过遍历或批量处理,强制统一了所有列的转换逻辑,避免了这种不一致性。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:35:35