如何在Pandas DataFrame中将不同格式字符串日期转为指定格式
解决方案
问题分析
你之前的代码无效是因为指定的format='%Y-%m-%d'和实际日期格式完全不匹配,导致pd.to_datetime转换失败返回NaT,后续fillna又把原字符串填回了列中,所以没有任何变化。
分步处理两种日期格式
我们需要区分纯数字格式(如23309)和字母缩写格式(如23MAR),分别处理后合并结果:
- 导入依赖库
import pandas as pd from pandas.tseries.offsets import MonthEnd
- 处理纯数字日期
对于23309这类格式,前两位是年份(23→2023),第三位是月份(3→03),最后两位是日期(09),用%y%m%d格式解析:
numeric_dates = pd.to_datetime(df['Date'], format='%y%m%d', errors='coerce')
- 处理字母缩写日期
对于23MAR这类格式,前两位是年份,后三位是月份缩写,先解析为当月第一天,再通过MonthEnd偏移量获取当月最后一天:
alpha_dates = pd.to_datetime(df['Date'], format='%y%b', errors='coerce') + MonthEnd(1)
- 合并结果
用combine_first优先取纯数字解析的结果,若为NaT则取字母格式解析的结果:
df['Date'] = numeric_dates.combine_first(alpha_dates)
- 转换为字符串格式(可选)
如果需要将datetime类型转为yyyy-mm-dd格式的字符串,添加以下代码:
df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')
示例验证
假设输入DataFrame为:
df = pd.DataFrame({'Date': ['23MAR', '23309', '24JAN', '24115']})
处理后df['Date']的结果为:
0 2023-03-31 1 2023-03-09 2 2024-01-31 3 2024-01-15 Name: Date, dtype: datetime64[ns]
如果执行了字符串转换步骤,则结果为字符串类型的对应日期。
内容的提问来源于stack exchange,提问作者Thomas Amal
相关产品推荐
相关产品推荐

