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
相关产品推荐
相关产品推荐

