如何在Python Pandas中将YYYYMMDD格式日期列转为MM-DD-YYYY?
解决DataFrame中YYYYMMDD格式日期转MM-DD-YYYY并保留0值的问题
问题说明
我有一个包含Valuation Date列的DataFrame,该列数据为YYYYMMDD格式的数值,需要转换为MM-DD-YYYY格式的标准日期字符串。同时要保留列中的0值,且避免用迭代循环处理(原循环代码不仅会用单个值覆盖84k行数据,效率还极低)。
原错误循环代码:
for val in df['Valuation Date']: if val == 0: val == 0 else: val = str(val) vy = val[:4] vm = val[4:6] vd = val[6:8] val = date(int(vy),int(vm),int(vd)) df['Valuation Date'] = val
原代码问题分析
- 循环中直接执行
df['Valuation Date'] = val,会把整列数据覆盖为当前循环的val值,最终整列只剩最后一次循环的结果 - 逐行迭代处理DataFrame属于低效操作,完全不符合Pandas的设计逻辑
修正后的解决方案
方案1:修复后的apply方法(修正@thomask方案的格式符错误)
原方案中误用了%M(代表分钟),月份格式符应为%m,同时补充0值的返回逻辑:
from datetime import datetime def change_format(val): if val == 0: return 0 # 保留原始0值 else: # 解析YYYYMMDD格式字符串为日期对象 date_obj = datetime.strptime(str(val), "%Y%m%d") # 转换为MM-DD-YYYY格式字符串返回 return date_obj.strftime("%m-%d-%Y") df['Valuation Date'] = df['Valuation Date'].apply(change_format)
方案2:高效向量化操作(推荐用于84k行大数据集)
用Pandas原生向量化方法替代逐行处理,效率提升显著:
import pandas as pd # 先将列转为字符串类型,统一处理格式 df['Valuation Date'] = df['Valuation Date'].astype(str) # 用mask实现批量替换:仅非0值转换格式,0值保留 df['Valuation Date'] = df['Valuation Date'].mask( df['Valuation Date'] != '0', pd.to_datetime(df['Valuation Date'], format="%Y%m%d").dt.strftime("%m-%d-%Y") ) # 可选:若需要将0转回数值类型 df['Valuation Date'] = df['Valuation Date'].replace('0', 0)
关键注意点
- 日期格式符区分:
%m是2位月份(如01、12),%M是分钟,不要混淆 - 向量化操作是Pandas处理大数据的最优方式,比
apply和循环效率高一个量级 - 可根据需求调整0值的存储类型(字符串'0'或数值0)
内容的提问来源于stack exchange,提问作者snek
相关产品推荐
相关产品推荐

