Pandas日期列格式转换错误,如何按输入格式正确转换?
问题根源分析
你遇到的日期转换错误,核心原因是**dayfirst=True参数用反了**!你的原始日期格式是yyyy-mm-dd(年-月-日),但dayfirst=True会告诉解析器把日期字符串的第一个数字段当成「日」,第二个当成「月」——比如2018-04-06会被错误解析为「2018年6月4日」,这就是前几个日期乱掉的原因。
另外,你自定义函数里的空值判断也有问题:Pandas中的空值是NaN(浮点类型),不是字符串'nan',用x != 'nan'根本无法识别真正的空值,会导致漏判。
最优解决方案:用Pandas内置工具(推荐)
Pandas有专门处理日期的内置方法pd.to_datetime,比自定义函数更高效、更可靠,还能自动处理空值和异常格式:
import pandas as pd # 第一步:将列转换为Pandas datetime类型,无法解析的内容转为NaT(空日期) read4['Column Name'] = pd.to_datetime(read4['Column Name'], errors='coerce') # 第二步:格式化为你需要的yyyy/mm/dd格式(如果要yyyy-mm-dd就改成'%Y-%m-%d') read4['Column Name'] = read4['Column Name'].dt.strftime('%Y/%m/%d') # 第三步(可选):把空日期(NaT)替换为空字符串,和你原需求一致 read4['Column Name'] = read4['Column Name'].fillna('')
用这个方法处理你的测试数据,就能得到完全正确的结果:
2018/04/06
2018/04/06
2018/04/09
2018/04/19
2018/04/19
2018/04/17
如果你坚持用自定义函数
如果你一定要保留自定义函数的逻辑,需要做两个修改:
- 去掉
dayfirst=True,因为原始日期是年-月-日格式,解析器会自动识别 - 用
pd.isna()正确判断空值,替换原来错误的字符串判断
修改后的代码:
from dateutil.parser import parse import pandas as pd def change_date_format(x): # 正确判断空值、空字符串、0这些无效值 if pd.isna(x) or str(x).strip() in ['', '0']: return '' # 去掉dayfirst=True,让解析器按年-月-日的默认逻辑解析 return parse(str(x)).strftime('%Y/%m/%d') # 按需改成'%Y-%m-%d' read4['Column Name'] = read4['Column Name'].apply(change_date_format)
内容的提问来源于stack exchange,提问作者Piyush S. Wanare
相关产品推荐
相关产品推荐

