如何将含时分秒的日期列转为datetime类型且保留原始值
日期列转换为datetime类型的解决方法
你的数据列格式示例:
| Date |
|---|
| 9999-12-31 00:00:00 |
你尝试用pd.to_datetime()转换时报错,用errors='coerce'会得到NaT,不符合需求;自己写的apply函数也没能把列转为datetime类型。
问题原因
你用的strptime格式串%Y-%m-%d %H:%M:%S.%f是针对带毫秒的日期,但你的数据是%Y-%m-%d %H:%M:%S格式(无毫秒),格式不匹配导致转换异常;另外用apply生成的datetime.datetime对象,pandas不会自动转为datetime64类型。
解决方法
方法一:修正格式串后显式转换
先修正格式匹配问题,再把列转为pandas的datetime类型:
import datetime import pandas as pd # 修正格式串,去掉多余的.%f adr_df['HIS_TS_END'] = adr_df['HIS_TS_END'].apply( lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') if isinstance(x, str) else pd.NaT ) # 显式转换为pandas datetime类型 adr_df['HIS_TS_END'] = pd.to_datetime(adr_df['HIS_TS_END'], errors='raise') # 验证类型 print(type(adr_df.iloc[0]['HIS_TS_END']))
方法二:直接用pd.to_datetime指定格式(推荐)
pandas自带的to_datetime支持指定格式,无需手动写apply,效率更高:
import pandas as pd adr_df['HIS_TS_END'] = pd.to_datetime(adr_df['HIS_TS_END'], format='%Y-%m-%d %H:%M:%S', errors='raise')
指定format参数后,pandas会精准匹配日期格式,直接生成pandas的Timestamp类型(即datetime64类型),不会报错。
如果你的列中同时存在带毫秒和不带毫秒的日期格式,可以省略format参数让pandas自动推断,但指定格式的方式更快更可靠。
内容的提问来源于stack exchange,提问作者Leyla Elkhamlichi
相关产品推荐
相关产品推荐

