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

如何在Pandas DataFrame中从兼具datetime与int特性的DateTime列提取月份?

解决混合类型日期列提取月份的问题

嘿,我来帮你搞定这个头疼的问题!从你的描述来看,核心问题是**Order Date列是混合类型**——里面同时存在datetime.datetime对象和整数(这些整数应该是Excel的日期序列号,也就是把日期转成了从1899-12-30开始计数的天数),这才导致你用不同方法时出现矛盾的错误。

下面给你两种无需遍历DataFrame的高效解决方案:

方案一:统一转换为datetime类型(推荐)

先把整列统一转换成标准的datetime类型,pandas的pd.to_datetime()函数能自动识别datetime对象和Excel日期序列号,非常省心:

import pandas as pd

# 读取数据
sales_data = pd.read_excel(r'Sample Sales Data.xlsx')

# 统一转换Order Date列为datetime,errors='coerce'会把无法转换的内容转为NaT(方便后续排查)
sales_data['Order Date'] = pd.to_datetime(sales_data['Order Date'], errors='coerce')

# 现在直接用dt属性提取月份到新列,完全不用遍历!
sales_data['Order Month'] = sales_data['Order Date'].dt.month

为什么之前的方法会出错?

  • 你用apply(lambda x: x.strftime("m"))时,遇到整数类型的元素就会报错,因为int没有strftime方法;
  • 而x.dt.month是Series的专属属性,不能在单个元素(apply里的x是单个值)上使用,所以也会报错。

统一转换后,整列都是datetime类型,直接用dt.month就能快速提取月份,效率远高于遍历。

方案二:针对混合类型直接处理(不推荐,仅作参考)

如果不想修改原列的类型,可以用np.where结合类型判断,分别处理datetime和整数元素:

import pandas as pd
import numpy as np
from datetime import datetime

sales_data = pd.read_excel(r'Sample Sales Data.xlsx')

# 判断元素类型,分别处理:datetime直接取月份,整数转成datetime后取月份
sales_data['Order Month'] = np.where(
    sales_data['Order Date'].apply(lambda x: isinstance(x, datetime)),
    sales_data['Order Date'].dt.month,
    pd.to_datetime(sales_data['Order Date'], unit='D', origin='1899-12-30').dt.month
)

这里的origin='1899-12-30'是因为Excel的日期序列号起始点是这个日期,用unit='D'表示按天数转换。

总结

优先选方案一,统一转换为datetime类型后,后续所有日期相关操作(比如提取日、年、星期几)都能通过dt属性轻松完成,代码更简洁,运行效率也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:22:34