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

Python Pandas:将Object类型日期转换为MM/DD/YYYY格式

问题:将DataFrame中混合格式的Object类型日期列转换为MM/DD/YYYY格式

需要把DataFrame中Object类型的日期列统一转换为MM/DD/YYYY格式,这些日期存在两种格式:

  • 带时间戳的YYYY/MM/DD HH:MM:SS(如'2022/08/23 17:30:00')
  • 纯日期YYYY/MM/DD(如'2022/10/20')

数据集CreditDetail_bkp包含SO Start Date、SO End Date、Cancellation Date (UTC)、Registration Date (UTC)、Country Hire Date等多个日期列,尝试多种方法均报错,无法得到预期格式。

现有日期列数据情况

打印各日期列唯一值的代码:

# 打印各日期列的唯一值
print('SO Start Date', CreditDetail['SO Start Date'].unique())
print('##########################################')
print('SO End Date', CreditDetail['SO End Date'].unique())
print('##########################################')
print('Cancellation Date (UTC)', CreditDetail['Cancellation Date (UTC)'].unique())
print('##########################################')
print('Registration Date (UTC)', CreditDetail['Registration Date (UTC)'].unique())
print('##########################################')
print('Country Hire Date', CreditDetail['Country Hire Date'].unique())

输出结果:

SO Start Date [nan '2022/08/23 17:30:00' '2022/08/25 15:02:00' ... '2022/09/13 08:43:00'
 '2022/09/14 19:00:00' '2022/08/17 18:00:00']
##########################################
SO End Date [nan '2022/08/23 18:30:00' '2022/08/25 16:46:00' ... '2022/09/14 20:00:00'
 '2022/09/30 15:00:00' '2022/08/17 19:30:00']
##########################################
Cancellation Date (UTC) [nan '2022/10/20' '2022/08/02']
##########################################
Registration Date (UTC) [nan '2023/01/03' '2022/08/31' '2022/11/04' '2022/11/23' '2022/11/21'
 '2022/09/18' '2022/08/04' '2022/09/16' '2022/08/16' '2022/12/07']
##########################################
Country Hire Date ['2022/08/17' '2022/09/05' '2022/08/22' ... '1993/09/13' '2018/06/30'
 '2022/05/21']

尝试过的报错方法

# Approach1:直接调用strftime,报错原因:列是Object类型,非datetime对象
CreditDetail_bkp['Cancellation Date (UTC)_1'] = CreditDetail_bkp['Cancellation Date (UTC)'].strftime("%m/%d/%Y")

# Approach2:apply调用strftime,报错原因:存在NaN值(float类型),无strftime方法
CreditDetail_bkp['Cancellation Date (UTC)'].apply(lambda x: x.strftime('%m%d%Y'))

# Approach3:用dt.strftime,报错原因:列是Object类型,没有dt属性
CreditDetail_bkp['SO Start Date1'] = CreditDetail_bkp['SO Start Date'].dt.strftime('%m%d%Y')

# Approach4:转换后调用strftime,报错原因:pd.to_datetime返回Series,需用dt.strftime而非直接strftime
pd.to_datetime(CreditDetail_bkp['Cancellation Date (UTC)_1']).strftime("%m/%d/%Y")

正确解决方案

核心思路:先将Object类型的日期列统一解析为datetime类型,再格式化为MM/DD/YYYY字符串。

单个列处理示例

# 1. 将列转换为datetime类型,errors='coerce'把无效值转为NaT
CreditDetail_bkp['Cancellation Date (UTC)_converted'] = pd.to_datetime(
    CreditDetail_bkp['Cancellation Date (UTC)'],
    errors='coerce'
)
# 2. 格式化为MM/DD/YYYY字符串,NaT会转为NaN
CreditDetail_bkp['Cancellation Date (UTC)_formatted'] = CreditDetail_bkp['Cancellation Date (UTC)_converted'].dt.strftime('%m/%d/%Y')

批量处理所有日期列

# 定义需要处理的日期列列表
date_columns = [
    'SO Start Date',
    'SO End Date',
    'Cancellation Date (UTC)',
    'Registration Date (UTC)',
    'Country Hire Date'
]

# 循环处理每个列
for col in date_columns:
    # 转换为datetime类型
    CreditDetail_bkp[f'{col}_converted'] = pd.to_datetime(CreditDetail_bkp[col], errors='coerce')
    # 格式化为MM/DD/YYYY
    CreditDetail_bkp[f'{col}_formatted'] = CreditDetail_bkp[f'{col}_converted'].dt.strftime('%m/%d/%Y')

说明

  • pd.to_datetime可以自动识别带时间和不带时间的两种格式,无需指定format参数;
  • errors='coerce'确保无法解析的值转为NaT(datetime类型的空值),避免报错;
  • dt.strftime('%m/%d/%Y')将datetime对象转为指定格式的字符串,NaT会转为NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:20:50