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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:45:34