如何将仅含年月、日为00的int64列转换为年月格式的datetime类型?
错误原因分析
- 第一种方案用
%Y%m%d格式解析时,传入值的日位为00,不存在合法的0号日期,pandas解析失败返回NaT - 第二种方案大概率是字符串操作存在隐式异常:比如部分值转字符串后长度异常、存在非数字字符等,导致切取前6位后仍不符合
%Y%m格式要求,解析失败
解决方案
首先说明:datetime类型本身会存储完整的年、月、日信息,无法仅存储年月维度。如果你需要195012这类展示效果,可根据使用场景选择以下两种方案:
方案1:转为Period年月类型(推荐,支持时间运算)
Period类型是pandas专门用于时间周期的数据类型,完美适配年月维度的使用场景,支持时间偏移、分组聚合等时间运算:
# 直接通过整数运算去掉末尾两位日位,避免字符串操作异常 df['x'] = pd.to_datetime(df['x'] // 100, format='%Y%m').dt.to_period('M') # 如果需要输出195012格式的整数结果,追加以下代码即可 df['x'] = df['x'].dt.strftime('%Y%m').astype(int)
方案2:转为格式化字符串(仅用于展示)
如果不需要做时间运算,只需要输出固定格式的年月字符串,可以直接修正非法的日位后解析格式化:
# 将末尾的非法00日替换为合法的01日,解析后再格式化为年月字符串 df['x'] = pd.to_datetime( df['x'].astype(str).str.replace(r'00$', '01', regex=True), format='%Y%m%d' ).dt.strftime('%Y%m')
两种方案都可以兼容你给出的示例值19501200、19541100、19590300,不会出现NaT问题。
内容的提问来源于stack exchange,提问作者박혜림
相关产品推荐
相关产品推荐

