Pandas分组后Datetime列格式异常及strftime调用报错问题
解决分组后Datetime列转numpy.datetime64导致的strftime报错问题
我之前也踩过这个一模一样的坑!问题核心在于groupby().first()操作后,pandas偶尔会把带时区的pandas Timestamp类型转换成numpy原生的datetime64类型,而numpy的datetime64对象并没有strftime方法,这就是你遇到AttributeError的原因。
先拆解你的场景:
原始DataFrame里的日期列是带时区的pandas Timestamp(比如2015-02-25 17:01:21-03:00),但分组取首行后,部分行的日期格式变成了numpy datetime64的样式(比如2015-02-26T03:18:10.000000000),类型转换直接导致后续调用strftime失败。
给你三种实用的解决方案:
方案1:先把日期列强制转回pandas Timestamp类型
在调用strftime之前,手动将目标列重新转换成pandas的datetime类型,就能恢复strftime方法的使用:
# 强制转换回pandas datetime类型 df['date_created_user'] = pd.to_datetime(df['date_created_user']) # 生成目标列 df['signup_period'] = df['date_created_user'].apply(lambda x: x.strftime('%Y-%m'))
方案2:使用pandas的dt访问器(更简洁高效)
pandas专门提供了dt访问器来处理datetime系列,它会自动兼容numpy datetime64类型并转换为pandas Timestamp,直接调用即可:
df['signup_period'] = df['date_created_user'].dt.strftime('%Y-%m')
这个方法不需要额外的类型转换步骤,是处理这类问题最常用的方式。
方案3:分组时用agg显式指定聚合规则(从根源避免类型转换)
如果想在分组阶段就避免类型丢失,可以用agg方法明确指定每个列的聚合逻辑,替代first()方法,这样能更稳定地保留原始数据类型:
df.sort_values('date_created_status', inplace=True) # 显式定义每个列的聚合方式,确保datetime列保留pandas类型 df = df.groupby('user_id', as_index=False).agg({ 'id': 'first', 'date_created_status': 'first', 'date_created_user': 'first' }) # 后续调用strftime不会再报错 df['signup_period'] = df['date_created_user'].dt.strftime('%Y-%m')
额外小提示:
如果你的日期列带时区,建议提前统一时区设置,能避免很多隐性的类型问题:
# 确保日期列统一为UTC时区(根据你的实际需求调整) df['date_created_user'] = pd.to_datetime(df['date_created_user'], utc=True)
内容的提问来源于stack exchange,提问作者Alexandre Lara




