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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:58:38