You need to enable JavaScript to run this app. 如何将仅含年月、日为00的int64列转换为年月格式的datetime类型?
优惠活动
大模型
产品
解决方案
定价
更多

如何将仅含年月、日为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,提问作者박혜림

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 19:09:01