You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动