我正在对交易数据进行分析,并希望计算自每个唯一客户的最近交易以来的天数。
我的初始数据框(df1)如下所示:
memberId transactionDate
1111 2017-12-01
2222 2017-12-03
1111 2017-12-05
3333 2017-12-06
TransactionDate采用日期时间格式。
这是我的代码尝试使用memberId和自最近一次交易以来的天数创建新数据框:
import datetime as dt
import pandas as pd
NOW=dt.datetime(2017,12,06)
gb=df1.groupby('memberId')
df2=gb.agg({'transactionDate': lambda x: (NOW-x.max())})
此返回数据框如:
memberId transactionDate
1111 1 days
2222 3 days
3333 0 days
但我希望将这些日子作为整数返回,而不是以天为单位。 我第二次尝试解决这个问题是:
NOW=dt.datetime(2017,12,06)
gb=df1.groupby('memberId')
df2=gb.agg({'transactionDate': lambda x: (NOW-x.max()).days})
这会返回看起来像transactionDate的纪元时间的内容,输出如下:
memberId transactionDate
1111 1970-01-01 00:00:00.000000001
2222 1970-01-01 00:00:00.000000003
3333 1970-01-01 00:00:00.000000000
我认为它会返回一个纪元时间戳,其天数为微秒。
如何获得如下输出:
memberId transactionDate
1111 1
2222 3
3333 0
答案 0 :(得分:1)
在进行计算之前尝试强制执行交易日期。我知道你说它是在DateTime格式,但我的解决方案正在 ngDoCheck() {
if(!this.immutable) {
let changes = this.differ.diff(this.value);
if(changes) {
this.handleDataChange();
}
}
}
:
pandas version 0.20.2
输出:
import datetime as dt
import pandas as pd
df1['transactionDate'] = pd.to_datetime(df1['transactionDate']) # <--- changing here
#can also try df1['transactionDate'] = pd.to_datetime(df1['transactionDate'], format='%Y-%M-%d', errors='coerce')
# will try to force the data into this format
#df1['transactionDate'].dtype
#dtype('<M8[ns]')
NOW=dt.datetime(2017,12,6)
# use NOW = dt.datetime.now() if you want to do this programmatically
gb=df1.groupby('memberId')
df2=gb.agg({'transactionDate': lambda x: (NOW-x.max()).days})
答案 1 :(得分:0)
尝试使用以下代码
df2.reset_index(inplace=True,drop=True)
df2['Date2']=df2['Date'].apply(lambda x: x.days)