Pandas混合类型列实现类日期转datetime、数值保留原值如何操作
实现方案
核心逻辑是先批量转换合法日期,再逐行判断替换,因为Pandas同列如果要混合存储datetime类型和字符串类型,需要用object dtype的Series,逐行处理可以避免dtype统一隐式转换的问题。
完整可运行代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame('23.Jan.2020 01.Mar.2017 5663:33 20.May.2021 626'.split(), columns=['raw']) # 第一步:批量转换符合格式的日期,不符合的转为NaT date_converted = pd.to_datetime(df['raw'], format='%d.%b.%Y', errors='coerce') # 第二步:逐行判断,转换成功的保留datetime值,失败的保留原始字符串 df['processed'] = [dt if pd.notna(dt) else raw for dt, raw in zip(date_converted, df['raw'])]
效果验证
执行如下代码查看每个元素的类型,可以看到合法日期已转为datetime类型,非法内容保留原始字符串:
print(df.applymap(type))
输出如下:
raw processed 0 <class 'str'> <class 'datetime.datetime'> 1 <class 'str'> <class 'datetime.datetime'> 2 <class 'str'> <class 'str'> 3 <class 'str'> <class 'datetime.datetime'> 4 <class 'str'> <class 'str'>
原有方案失败原因说明
errors='ignore'逻辑是:只要列中存在无法匹配格式的内容,就会放弃整列转换,直接返回原始字符串列,因此没有转换效果。errors='coerce'会把所有无法转换的内容替换为NaT,直接丢失原始值。df.where回填时会默认统一列的dtype,要么把datetime转为字符串,要么把字符串转为NaT,无法实现混合类型存储。
内容的提问来源于stack exchange,提问作者Prolle
相关产品推荐
相关产品推荐

