Python技术问题:无法将日期差转换为纯天数,求解决方案
问题解决:提取RFM模型中Recency的天数数值
数据文件内容
rfm_data.csv的内容如下:
CustomerID PurchaseDate TransactionAmount ProductInformation 8814 11-04-23 943.31 Product C 2188 11-04-23 463.70 Product A 4608 11-04-23 80.28 Product A 2559 11-04-23 221.29 Product A
原代码及报错
使用以下代码读取并转换数据时出现错误:
import pandas as pd from datetime import datetime data = pd.read_csv("rfm_data.csv") data['PurchaseDate'] = pd.to_datetime(data['PurchaseDate'], format='%d-%m-%y') data['Recency'] = (datetime.now().date() - data['PurchaseDate'].dt.date).dt.days
报错信息:
AttributeError: Can only use .dt accessor with datetimelike values. Did you mean: 'at'?
若删除.dt.days,Recency列会显示类似140 days, 0:00:00的timedelta格式,无法直接用于后续计算。
错误原因
datetime.now().date()是Python标准库的date对象,和data['PurchaseDate'].dt.date(pandas的date类型Series)相减后,得到的Series元素是Python原生的timedelta对象,而非pandas的Timedelta类型。.dt访问器仅支持pandas内置的datetime/timedelta类型Series,因此触发报错。
解决方案
提供两种可行的修改方式:
方式1:使用pandas Timestamp计算(推荐)
直接用pandas的Timestamp.now()替代原生datetime,相减后得到pandas的TimedeltaSeries,即可正常使用.dt.days提取天数数值:
import pandas as pd data = pd.read_csv("rfm_data.csv") data['PurchaseDate'] = pd.to_datetime(data['PurchaseDate'], format='%d-%m-%y') data['Recency'] = (pd.Timestamp.now() - data['PurchaseDate']).dt.days
方式2:用apply提取原生timedelta的天数
如果坚持使用原生datetime,可以通过apply方法遍历Series,提取每个timedelta对象的days属性:
import pandas as pd from datetime import datetime data = pd.read_csv("rfm_data.csv") data['PurchaseDate'] = pd.to_datetime(data['PurchaseDate'], format='%d-%m-%y') data['Recency'] = (datetime.now().date() - data['PurchaseDate'].dt.date).apply(lambda x: x.days)
两种方式最终都会得到纯数值格式的Recency列,满足后续计算需求。
内容的提问来源于stack exchange,提问作者JOSE PUEBLA
相关产品推荐
相关产品推荐

