Python Pandas计算日期之间的平均天数

jea*_*elj 2 python if-statement group-by average pandas

使用以下python pandas dataframe df:

Customer_ID | Transaction_ID
ABC            2016-05-06-1234
ABC            2017-06-08-3456
ABC            2017-07-12-5678
ABC            2017-12-20-6789
BCD            2016-08-23-7891
BCD            2016-09-21-2345
BCD            2017-10-23-4567
Run Code Online (Sandbox Code Playgroud)

不幸的是,日期隐藏在transaction_id字符串中。我以这种方式编辑了数据框。

#year of transaction
df['year'] = df['Transaction_ID'].astype(str).str[:4]

#date of transaction
df['date'] = df['Transaction_ID'].astype(str).str[:10]

#format date
df['date']=pd.to_datetime(df['date'], format='%Y-%m-%d')

#calculate visit number per year
df['visit_nr_yr'] = df.groupby(['Customer_ID', 'year']).cumcount()+1
Run Code Online (Sandbox Code Playgroud)

现在,df如下所示:

Customer_ID | Transaction_ID    | year  | date        |visit_nr_yr 
ABC            2016-05-06-1234    2016    2016-05-06    1            
ABC            2017-06-08-3456    2017    2017-06-08    1            
ABC            2017-07-12-5678    2017    2017-07-12    2            
ABC            2017-12-20-6789    2017    2017-12-20    3            
BCD            2016-08-23-7891    2016    2016-08-23    1            
BCD            2016-09-21-2345    2016    2016-09-21    2            
BCD            2017-10-23-4567    2017    2017-10-23    1            
Run Code Online (Sandbox Code Playgroud)

我需要计算以下内容:

  • 每次访问之间的平均间隔时间是多少(因此1&2与2&3之间)
  • 一般而言,两次造访之间的平均间隔时间是多少

首先,我想包括以下列“ days_between_visits_by year”(要由Customer_ID完成):

Customer_ID|Transaction_ID  |year| date       |visit_nr_yr|days_bw_visits_yr 
ABC         2016-05-06-1234  2016  2016-05-06   1             NaN
ABC         2017-06-08-3456  2017  2017-06-08   1             NaN
ABC         2017-07-12-5678  2017  2017-07-12   2             34
ABC         2017-12-20-6789  2017  2017-12-20   3             161
BCD         2016-08-23-7891  2016  2016-08-23   1             NaN
BCD         2016-09-21-2345  2016  2016-09-21   2             29
BCD         2017-10-23-4567  2017  2017-10-23   1             NaN
Run Code Online (Sandbox Code Playgroud)

请注意,如果有人在同一天进行两次访问,我会故意避免使用0并保留Nans。

接下来,我想按访问次数计算两次访问之间的平均天数(因此,一年内1&2与2&3之间)。寻找此输出:

avg_days_bw_visits_1_2 | avg_days_bw_visits_2_3
31.5                     161
Run Code Online (Sandbox Code Playgroud)

最后,我想计算一般的两次访问之间的平均天数:

output: 203.8 
#the days between visits are 398,34,161,29,397 and the average of those 
 numbers is 203.8
Run Code Online (Sandbox Code Playgroud)

我对如何创建“ days_bw_visits_yr”列感到困惑。Nans必须从数学中排除。

par*_*asu 6

通过将“日期”列向下移动1,可以获取上次访问日期(按客户和年份分组):

df['previous_visit'] = df.groupby(['Customer_ID', 'year'])['date'].shift()
Run Code Online (Sandbox Code Playgroud)

因此,每次访问之间的天数仅仅是不同的:

df['days_bw_visits'] = df['date'] - df['previous_visit']
Run Code Online (Sandbox Code Playgroud)

要计算均值,请将日期增量对象转换为天:

df['days_bw_visits'] = df['days_bw_visits'].apply(lambda x: x.days)
Run Code Online (Sandbox Code Playgroud)

平均造访天数:

df.groupby('visit_nr_yr')['days_bw_visits'].agg('mean')

df['days_bw_visits'].mean()
Run Code Online (Sandbox Code Playgroud)

  • 对于任何将此视为解决方案的人。确保在执行“shift()”之前对日期列进行排序。所以第一行代码应该是 `df = df.sort_values(by='date)` 然后继续 parasu 的代码。我只花了 30 分钟试图找出代码出了什么问题。我的 df 已经排序了 99%,除了几行导致了一些奇怪的负值。 (2认同)