You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:32