如何在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
相关产品推荐
相关产品推荐

