Pandas to_datetime()转换时日期小于13日交换日和月的问题求助
解决Pandas日期解析中日月错误交换的问题
这个问题我之前踩过一模一样的坑!核心原因是pd.to_datetime()的自动解析逻辑会优先尝试MM/DD/YYYY(美式日期)格式,当你的日份≤12时,它会误以为这是月份,导致日月颠倒;而当日份≥13时,因为没有13月,它才会按DD/MM/YYYY(欧式日期)解析,所以才出现“一半正确一半错”的诡异情况。
最直接的解决方案:指定日期格式
别让Pandas瞎猜日期规则,直接告诉它你的原始字符串格式是DD/MM/YYYY,用format参数强制解析逻辑:
# 针对你的日期格式:11/06/2015(日/月/年) tmp = pd.to_datetime(tmp, format='%d/%m/%Y')
如果你的日期包含时分秒(比如11/06/2015 09:30:00),就把格式调整为:
tmp = pd.to_datetime(tmp, format='%d/%m/%Y %H:%M:%S')
这里的格式符对应含义:
%d:两位数字的日(01-31)%m:两位数字的月(01-12)%Y:四位数字的年(2015)%H:%M:%S:24小时制的时分秒
为什么你之前的方法没效果?
unit="ns"是用来处理时间戳数值的(比如从1970年开始的纳秒数),完全不适用字符串日期的解析场景;strftime()是把datetime对象转换成字符串,不是解析字符串,而且你用的%#m/%#d/%Y本身就是月/日/年的格式,自然会把所有日期的日月颠倒;- 循环修改的问题在于:你在循环里对
t重新赋值,只是修改了循环变量的副本,并没有改变原Series中的元素(Python的datetime是不可变对象),所以完全起不到作用。
进阶:读取文件时直接解析日期
可以在read_csv阶段就指定日期列和解析规则,一步到位:
# 假设日期数据在第0列(根据你的实际列索引修改) df = pd.read_csv( PATH+file, header=None, error_bad_lines=False, sep='\t', parse_dates=[0], # 指定要解析成日期的列 date_parser=lambda x: pd.to_datetime(x, format='%d/%m/%Y') )
处理格式不统一的情况
如果你的数据里有少数格式不一致的日期,可以加上errors='coerce'参数,把无法解析的日期转为NaT(缺失值),方便后续排查:
tmp = pd.to_datetime(tmp, format='%d/%m/%Y', errors='coerce')
内容的提问来源于stack exchange,提问作者Oumab10
相关产品推荐
相关产品推荐

