如何在Pandas中将日期列解析为datetime类型而非object类型?
问题描述
我尝试用pandas.read_csv的parse_dates参数将CSV中的published_at列解析为datetime类型,但执行后该列仍为object类型:
df = pd.read_csv(path, parse_dates=['published_at']) df.info()
输出显示:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 100000 entries, 0 to 99999 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 100000 non-null object 1 salary_from 48041 non-null float64 2 salary_to 53029 non-null float64 3 salary_currency 64733 non-null object 4 area_name 100000 non-null object 5 published_at 100000 non-null object dtypes: float64(2), object(4) memory usage: 4.6+ MB
我尝试过多种解析方法都无法将其转为datetime类型,请问该如何解决?
解决方案
1. 先确认日期列的实际格式
首先查看published_at列的样本数据,确认日期的具体格式(比如是否带时区、特殊分隔符、非标准格式):
print(df['published_at'].head(10)) # 或者查看唯一值样本 print(df['published_at'].unique()[:10])
这一步能帮你定位自动解析失败的原因——通常是pandas无法识别非标准日期格式。
2. 读取时指定日期格式
如果已经明确日期格式,在read_csv中通过date_parser参数指定解析逻辑:
from datetime import datetime # 替换为你的实际日期格式,比如'%Y-%m-%d %H:%M:%S' date_format = '%Y-%m-%d %H:%M:%S' df = pd.read_csv( path, parse_dates=['published_at'], date_parser=lambda x: datetime.strptime(x, date_format) )
3. 读取后强制转换
如果读取时自动解析失败,可以先读取为object类型,再用pd.to_datetime强制转换,同时指定格式和错误处理:
df = pd.read_csv(path) # 替换为你的实际日期格式 df['published_at'] = pd.to_datetime(df['published_at'], format='%Y-%m-%d %H:%M:%S', errors='coerce')
errors='coerce'会将无法解析的值转为NaT,方便后续排查异常数据;- 如果不确定格式,可以去掉
format参数,加上infer_datetime_format=True让pandas自动推断(大数据量下速度略慢,但更灵活):df['published_at'] = pd.to_datetime(df['published_at'], infer_datetime_format=True, errors='coerce')
4. 检查异常值
如果转换后出现大量NaT,说明存在不符合格式的异常数据,可以通过以下代码找出这些异常值:
invalid_dates = df[df['published_at'].isna()]['published_at'] print(invalid_dates.unique())
针对这些异常值,可以选择清理、修正后再重新转换。
内容的提问来源于stack exchange,提问作者Sergey Kazantsev
相关产品推荐
相关产品推荐

