You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

datetime列调用dt.month出空值?是否需重复执行pd.to_datetime?

Pandas Datetime列分组异常问题

场景与数据定义

我在使用pandas处理一个DataFrame,列数据类型预期如下:

  • order_id: int64
  • order_date: datetime64[ns]
  • promo_code: bool
  • order_fare: float64

DataFrame定义代码:

df = pd.DataFrame(data=
                  {"order_id":{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"14":15,"15":16,"16":17},
                   "order_date":{"0":"2021-09-25 00:00:00","1":"2021-09-14 00:00:00","2":"2021-08-31 00:00:00",
                                 "3":"2021-08-30 00:00:00","4":"2021-08-25 00:00:00","5":"2021-08-16 00:00:00",
                                 "14":"2021-08-31 00:00:00","15":"2021-08-24 00:00:00","16":"2021-08-14 00:00:00"},
                   "promo_code":{"0":False,"1":False,"2":False,"3":False,"4":False,"5":False,"14":True,"15":True,"16":True},
                   "order_fare":{"0":12.47,"1":7.89,"2":12.38,"3":1.69,"4":11.27,"5":18.16,"14":16.13,"15":14.89,"16":19.72}})

遇到的问题

尝试按月份分组,执行语句df = df.groupby(df.order_date.dt.month)后,order_id为15、16的两条数据的dt.month返回空值;但在分组前执行df['order_date'] = pd.to_datetime(df['order_date'])后,分组结果恢复正常。

疑问

  1. 该异常出现的原因是什么?
  2. 对已标记为datetime类型的列始终执行pd.to_datetime是否为最佳实践?

问题解答

1. 异常原因

你创建DataFrame时,order_date传入的是字符串值,pandas不会自动将字符串列解析为datetime类型——你看到的datetime64[ns]类型标注是错误的,实际执行df.dtypes会发现该列是object类型(即字符串集合)。

当对object类型列调用.dt.month时,pandas无法正确提取日期属性,返回空值;而手动执行pd.to_datetime后,该列被强制转换为标准的datetime64[ns]类型,.dt.month就能正常提取月份信息。

至于仅order_id15、16的行出现空值,大概率是因为你的DataFrame索引不连续(存在跳跃的索引14、15、16),导致pandas在自动类型推断时出现局部偏差,部分行被错误标记为datetime,另一部分仍为字符串,从而出现部分空值的现象,但核心问题始终是列未被正确转换为datetime类型。

2. 是否始终执行pd.to_datetime?

这不是最佳实践,要分场景处理:

  • 如果已经确认列是datetime64[ns]类型,重复转换会浪费计算资源,尤其处理大数据集时完全没必要。
  • 若数据来源不可靠(比如可能是字符串、混合类型),可以带errors='coerce'参数执行转换,确保列类型统一,同时将无法解析的日期转为NaT(缺失日期值):
    df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')
    
  • 更高效的方式是从源头解决:创建DataFrame时通过dtype参数指定日期类型,或读取外部数据时用parse_dates参数直接解析日期列:
    # 创建时指定类型
    df = pd.DataFrame(data=your_data, dtype={'order_date': 'datetime64[ns]'})
    # 读取CSV时解析日期
    df = pd.read_csv('data.csv', parse_dates=['order_date'])
    

内容的提问来源于stack exchange,提问作者Cruton2025

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:43:21