如何避免pd.to_datetime将非日期字符串误转为日期?
如何避免pandas将非日期字符串错误转换为日期
当使用pd.to_datetime(df['_date_'], errors='coerce')转换日期时,像"--70--"这类非日期字符串会被错误解析为2070-01-01,"--99--"被解析为1999-01-01。这是因为pandas默认会尝试从字符串中提取数字部分构造日期,哪怕字符串包含非日期格式的符号。
以下是两种可行的解决方法:
方案1:指定明确的日期格式
如果你的合法日期只有固定格式(比如示例中的"22 Jun 2023",对应格式%d %b %Y),直接在pd.to_datetime中指定format参数,只有完全匹配该格式的字符串才会被转换,其他都会转为NaT:
import pandas as pd df = pd.DataFrame( {'_date_': ['22 Jun 2023', '123', '--99--', "--70--", "b", "c", "d"]}) # 指定日期格式 df["_date_"] = pd.to_datetime(df['_date_'], format='%d %b %Y', errors='coerce') print(df['_date_'])
输出结果:
0 2023-06-22 1 NaT 2 NaT 3 NaT 4 NaT 5 NaT 6 NaT Name: _date_, dtype: datetime64[ns]
方案2:用正则表达式预先筛选合法日期
如果存在多种合法日期格式,可以先用正则匹配出符合日期模式的字符串,再进行转换:
import pandas as pd import re df = pd.DataFrame( {'_date_': ['22 Jun 2023', '123', '--99--', "--70--", "b", "c", "d"]}) # 定义匹配合法日期的正则(这里匹配"日 月缩写 年"的格式) date_regex = r'^\d{1,2} [A-Za-z]{3} \d{4}$' # 生成匹配掩码 valid_dates = df['_date_'].str.match(date_regex) # 仅对匹配的字符串转换日期,不匹配的设为NaT df['_date_'] = pd.to_datetime(df.loc[valid_dates, '_date_'], errors='coerce') df.loc[~valid_dates, '_date_'] = pd.NaT print(df['_date_'])
输出结果与方案1一致。
内容的提问来源于stack exchange,提问作者Vahe
相关产品推荐
相关产品推荐

