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

Python中数字格式日期转换失败问题求助

解决Pandas中数字格式日期转换问题

我有一列代表日期的数字,无法转换为日期格式,示例如下:

1022021

7302021

所有行的格式规则为:第一位是月份,接下来两位是日期,最后四位是年份。这些日期值从长字符串提取后,原本的前导零自动消失,尝试多种方法均失败。


之前尝试的方法及问题

  1. 切片拼接后转日期:
df["Date Worked"] = pd.to_datetime( df["Date Worked"].str.slice(0,1).astype(str) + "/" + df["Date Worked"].str.slice(1,3)
                                   + '/' + df["Date Worked"].str.slice(3,7) )

报错:

ParserError: day is out of range for month: 0/ /

原因:如果列是数字类型,str.slice会返回空值,导致拼接出无效的日期字符串;即使转成字符串,月份为1-9时是1位,但10-12月会是2位,切片逻辑不通用。

  1. 直接转日期:
df['Date Worked'] = pd.to_datetime(df['Date Worked'])

结果全部显示为1970-01-01 00:00:00.001022021,原因是Pandas把数字当作时间戳毫秒数处理,完全不符合需求。

  1. 指定unit='s'转日期:
df['Date Worked'] = pd.to_datetime(df['Date Worked'], unit='s')

结果全部显示为1970-01-12 19:53:41,原因是把数字当作从1970-01-01开始的秒数,同样不符合需求。


正确解决方案

核心思路:补回丢失的前导零,将数字转为标准的MMDDYYYY格式字符串,再用指定格式解析日期。

代码实现:

# 先将数字转为字符串,补前导零至8位(恢复原本的MMDDYYYY格式)
df["Date Worked"] = pd.to_datetime(
    df["Date Worked"].astype(str).str.zfill(8),
    format="%m%d%Y"
)

解释

  • astype(str):将数字列转为字符串列,确保后续字符串操作有效;
  • str.zfill(8):给字符串补前导零,让所有日期字符串长度统一为8位(比如1022021变为01022021,7302021变为07302021);
  • format="%m%d%Y":明确告诉Pandas解析规则:前两位是月份(%m)、中间两位是日期(%d)、最后四位是年份(%Y),避免自动推断出错。

测试示例:

  • 1022021 → 补零为01022021 → 解析为2021-01-02;
  • 7302021 → 补零为07302021 → 解析为2021-07-30。

内容的提问来源于stack exchange,提问作者eltoukhy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:54:15