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
相关产品推荐
相关产品推荐

