Python中数字格式日期转换失败问题求助
解决Pandas中数字格式日期转换问题
我有一列代表日期的数字,无法转换为日期格式,示例如下:
1022021
7302021
所有行的格式规则为:第一位是月份,接下来两位是日期,最后四位是年份。这些日期值从长字符串提取后,原本的前导零自动消失,尝试多种方法均失败。
之前尝试的方法及问题
- 切片拼接后转日期:
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位,切片逻辑不通用。
- 直接转日期:
df['Date Worked'] = pd.to_datetime(df['Date Worked'])
结果全部显示为1970-01-01 00:00:00.001022021,原因是Pandas把数字当作时间戳毫秒数处理,完全不符合需求。
- 指定
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
相关产品推荐
相关产品推荐

