Pandas如何将DataFrame中3个日期列的datetime值转换为月份值
问题原因
代码执行后无变化的核心原因:df.apply()默认按列遍历,传入lambda的参数x是整列的Series对象,不是单个单元格的datetime值,因此isinstance(x , datetime.datetime)的判断结果永远为False,逻辑直接走else分支返回原列,数据集自然不会发生改动。
推荐解决方案
优先使用Pandas原生的日期属性访问器做批量处理,运行效率远高于逐单元格判断,不需要额外写类型判断逻辑。
方案1:指定3个目标列处理
明确知道要处理的列名时直接指定列即可:
import pandas as pd # 定义需要转换的日期列列表 date_columns = ['date 1', 'date 2', 'date 3'] # 批量提取两位格式的月份 df[date_columns] = df[date_columns].apply(lambda col: col.dt.strftime('%m'))
方案2:自动识别全表所有日期列处理
如果表中后续可能新增日期列,可以自动筛选所有datetime类型列做转换:
# 筛选所有datetime64类型的列 datetime_cols = df.select_dtypes(include=['datetime64[ns]']).columns df[datetime_cols] = df[datetime_cols].apply(lambda col: col.dt.strftime('%m'))
注意:不推荐通过加
axis=1逐行逐单元格遍历的方式实现转换,该方式运行效率比列批量处理低几个量级,仅做参考:# 低效写法,不推荐 import datetime df = df.apply(lambda row: row.apply(lambda x: x.strftime('%m') if isinstance(x, datetime.datetime) else x), axis=1)
转换效果验证
原始数据格式
| date 1 | date 2 | date 3 |
|---|---|---|
| 2022-05-26 00:00:00 | 2022-05-31 00:00:00 | 2022-06-05 00:00:00 |
| 2022-06-01 00:00:00 | 2022-06-13 00:00:00 | 2022-07-05 00:00:00 |
转换后目标格式
| date 1 | date 2 | date 3 |
|---|---|---|
| 05 | 05 | 06 |
| 06 | 06 | 07 |
内容的提问来源于stack exchange,提问作者MJKing
相关产品推荐
相关产品推荐

